使用gson和retrofit并创建了一个JsonDeserializer。
在java中,该类定义为:
public class Test implements JsonDeserializer<NavigationMenu[]> {...
在Kotlin中,它被定义为:
class NavigationMenuArrayDeserializer : JsonDeserializer<Array<NavigationMenu>> {...
在使用GSON注册后,将按预期调用java类。 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);
}
知道为什么吗?
答案 0 :(得分:1)
不幸的是,没有任何建议对我有用。我将调用类从java转换为kotlin,因为在kotlin中调用java类类型过去很容易为我工作......这就是诀窍。
我最初尝试从java类调用kotlin数组类仍然不成功,但我能够使配置工作,所以我称之为完整。
将OP中的配置java代码转换为Kotlin就可以了:
private val gsonConverter: GsonConverterFactory
get() {
val gsonBuilder = GsonBuilder()
gsonBuilder.setLenient()
gsonBuilder.registerTypeAdapter(Array<NavigationMenu>::class.java, NavigationMenuArrayDeserializer())
val gson = gsonBuilder.create()
return GsonConverterFactory.create(gson)
}
答案 1 :(得分:0)
我使用数组类解决了类似的问题。尝试这样的事情:
val clazz = (Array<NavigationMenu>::class).java
gson.fromJson(json, clazz)
我希望这可能有所帮助。
答案 2 :(得分:0)
您可以尝试使用此类TypeToken
。
private GsonConverterFactory getGsonConverter() {
val type = object : TypeToken< ArrayList < NavigationMenu >>(){}.getType()
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setLenient();
gsonBuilder.registerTypeAdapter(type, new NavigationMenuArrayDeserializer());
Gson gson = gsonBuilder.create();
return GsonConverterFactory.create(gson);
}