Tag: gson

用JSON解析json到Java Pojos中缺少一般信息

当从Kotlin调用Java类型和Gson时,我遇到了一个问题 Java POJO代表API响应,这是错误的 public class ApiResponse { @SerializedName("errors") public List<ApiResponseError> errors; } public class ApiResponseError { @SerializedName("code") public Integer code; @SerializedName("message") public String message; } 线上的http响应体 { "errors": [ { "code": 10002, "message": "Not found" } ] } 使用Gson将该响应解析为对象的kotlin代码。 val errorResponse = Gson().fromJson<ApiResponse>(jsonBody, ApiResponse::class.java) jsonBody是前一个代码片段中http响应正文的字符串表示形式。 实例化对象的调试器视图: 问题是ArrayList应该包含一个ApiResponseError对象而不是一个LinkedTreeMap 。 我尝试了没有在List<ApiResponseError> errors列表泛型类型相同的代码,结果是相同的,所以我猜测通用信息正在丢失某处,Gson默认为LinkedTreeMap 。 任何线索? 谢谢

使用Gson和Kotlin 1.0 beta 4反序列化具有惰性属性的类

使用Gson,我想反序列化一个包含懒惰属性的Kotlin类。 Kotlin 1.0 beta 4在对象反序列化过程中出现以下错误: Caused by: java.lang.InstantiationException: can't instantiate class kotlin.Lazy 用Kotlin 1.0 beta 2,我用@Transient annotaiton来标记属性,告诉Gson跳过它。 随着测试版4,这是不可能的,因为注释导致编译错误。 This annotation is not applicable to target 'member property without backing field' 我无法弄清楚如何解决这个问题。 有任何想法吗? 编辑:懒惰属性序列化为JSON( "my_lazy_prop$delegate":{} ),但这不是我想要的,因为它是从其他属性计算。 我想,如果我找到一种方法来防止财产被序列化,反序列化崩溃将被修复。

Gson无法解析Kotlin中的字符串json格式数据

我正在Kotlin写一个应用程序。 我有一个来自web服务的原始JSON字符串,我需要使用它与Gson。 我正在这样做: val gson = Gson() val friends = gson.fromJson(response.rawResponse, JsonElement::class) 但编译器无法找到正确的fromJson方法重载,而现在可用( fromJson(json: String!, typeOfT: Type!) )。 这是错误的: Error:(65, 50) None of the following functions can be called with the arguments supplied: public open fun <T : Any!> fromJson(json: JsonElement!, classOfT: Class<JsonElement!>!): JsonElement! defined in com.google.gson.Gson public open fun <T : Any!> fromJson(json: JsonElement!, […]

Kotlin不可为空值可以为null?

我有后端,返回给我一些JSON。 我解析到我的课堂: class SomeData( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String) 使用gson转换器工厂: Retrofit retrofit = new Retrofit.Builder() .baseUrl(ENDPOINT) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); 并在我的界面: interface MyAPI { @GET("get_data") Observable<List<SomeData>> getSomeData(); } 然后我从服务器(与rxJava)检索数据没有任何错误。 但我期待一个错误,因为我认为我应该这样做(为了防止GSON转换器错误,因为notNullableValue不存在于我的JSON响应): class SomeData @JvmOverloads constructor( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String = "") 在从后端接收数据并解析到具有不带def值的构造函数的我的SomeData类之后, notNullableValue […]

如何处理Kotlin中的空白参数?

在Java中,我们可以做以下 class A{ int id; String name; public A(){} public A(int id, String name){ this.id = id; this.name = name; } // getter/ setter } 那么我可以创建一个新的对象,并得到如下的JSON A a= new A() a.setName("test") System.out.println(new Gson().toJson(a)) 这给了我结果 {"name":"test"} 在kotlin我怎么能实现这个? 我面临的问题是kotlin说原始类型已被初始化。 所以在json中,我得到了id和name ; 我不想要 那么如何做到这一点?

Kotlin:单元测试在gson之后声明对象

我有这样的JUnit测试: Test fun testCategoriesLoading() { val subscriber = TestSubscriber<List<ACategory>>() service.categories().subscribe(subscriber) subscriber.awaitTerminalEvent() subscriber.assertNoErrors() } 服务是Retrofit ,它使用GsonConverter将json反序列化成 data class ACategory(val id: String, val title: String, val parentId: String?, val hasChildren: Boolean) 实例。 测试即将通过,即使ACategory填充id = null,title = null等 所以,就我所知,使用反射的gson和kotlin懒散地解决了第一次访问时的这种可空性约束。 有没有办法强制这个决心? 一些好看的解决方案,无需手动直接访问字段? 我真的不想手写每一个断言。

在Kotlin中使用TypeAdapter实现TypeAdapterFactory

我正在尝试在我的android项目中使用Kotlin语言实现一些特定的GSON TypeAdapter。 我正面临的问题是编译错误,无法推断类型: Type inference failed: 'T' cannot capture 'in (T..T?'. Type parameter has an upper bound 'Enum<T>' that cannot be satisfied capturing 'in' projection 代码如下: class SmartEnumTypeAdapterFactory(fallbackKey: String) : TypeAdapterFactory { private val fallbackKey = fallbackKey.toLowerCase(Locale.US) override fun <T : Any> create(gson: Gson?, type: TypeToken<T>): TypeAdapter<T>? { val rawType = type.rawType return if (!rawType.isEnum) […]

Kotlin数据类Gson序列化问题

林有点困惑我的kotlin类没有按预期工作: 用于检查更新信息的数据类: data class UpdateInfo constructor(//kotlin class val description: String, val force: Int, val platform: String, val title: String, val url: String, @SerializedName("version") val versionCode: Int = 0 ) : Serializable { val isForceUpdate = force == 1 } 还用于解码对象形式JSON的util: public class JsonUtil {//java class private static final Gson gson; static { BooleanAdapter booleanAdapter = […]

Kotlin Gson自定义解串器列表

如何在Gson注册自定义的Json解串器? 当我在java代码注册反序列化所有工作正常,但是当我把Kotlin转换为Java – 反序列化方法不叫。 Kotlin注册码: val listType: Type = object : TypeToken<List<Advert>>() {}.type val gson = GsonBuilder() .registerTypeAdapter(listType, deserializer) val retrofit = Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create(gson)) Java代码: Type listType = new TypeToken<List<Advert>>() {}.getType(); Gson gson = new GsonBuilder() .registerTypeAdapter(listType, deserializer) Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create(gson)) 反序列化器声明: class AdvertsDeserializer : JsonDeserializer<List<Advert>> { override fun deserialize(json: JsonElement?, typeOfT: […]

类型参数在Kotlin中不被识别

使用gson和翻新,并创建一个JsonDeserializer。 在Java中,该类定义为: public class Test implements JsonDeserializer<NavigationMenu[]> {… 在Kotlin中,它被定义为: class NavigationMenuArrayDeserializer : JsonDeserializer<Array<NavigationMenu>> {… Java类在被GSON注册后被调用。 Kotlin类永远不会被调用。 Retrofit jsonClient = new Retrofit .Builder() .baseUrl(baseUrl) .client(okHttpClient) .addConverterFactory(getGsonConverter()) .build(); … private GsonConverterFactory getGsonConverter() { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setLenient(); gsonBuilder.registerTypeAdapter(NavigationMenu[].class, new NavigationMenuArrayDeserializer()); Gson gson = gsonBuilder.create(); return GsonConverterFactory.create(gson); } 任何想法为什么?