Android 如何使用改型处理对象列表或单个对象的JSON响应?
我正在调用一个REST服务,而不是我的,它使用的是改型,如果有多个对象,则返回一个对象列表,如果有一个对象,则返回一个对象列表。我发现了一个类似的问题,但是建议更改我无法控制的API。我还阅读了thread,这似乎是一个很好的方法,但有没有办法通过改型来处理这个问题?您可以将API响应数据作为响应中的映射,然后根据您的需求直接解析它。您可以在这里检查JsonElement是否为JsonArray 例如:Android 如何使用改型处理对象列表或单个对象的JSON响应?,android,arrays,json,rest,retrofit,Android,Arrays,Json,Rest,Retrofit,我正在调用一个REST服务,而不是我的,它使用的是改型,如果有多个对象,则返回一个对象列表,如果有一个对象,则返回一个对象列表。我发现了一个类似的问题,但是建议更改我无法控制的API。我还阅读了thread,这似乎是一个很好的方法,但有没有办法通过改型来处理这个问题?您可以将API响应数据作为响应中的映射,然后根据您的需求直接解析它。您可以在这里检查JsonElement是否为JsonArray 例如: public fun parseData(val jsonElement:JsonEleme
public fun parseData(val jsonElement:JsonElement){
val gson = Gson()
if(jsonElementFromServer.isJsonArray()){
//here you can just parse it into some list of array
}else{
//here you can parse using gson to single item element or model
}
}
使用Gson获取项目或单个作为您提到的第二篇文章的作者,我还提到了该文章中描述的PostArrayOrSingleDeserializer的实现 在将Gson与改装的converter Gson一起使用时,您只需向自定义Gson实例注册适配器,并使用该Gson实例构建改装实例,请参见下面的示例帮助器类:
public class MyRetrofit {
public static MyAPI getMyApi() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Object.class,
new ObjectArrayOrSingleDeserializer())
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://example.org")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return retrofit.create(MyAPI.class);
}
}
因此,JsonDeserializer中名为ObjectArrayOrSingleDeserializer的对象就是您需要检查单个实例或数组的DTO。用相应的DTO替换对象,并相应地修改反序列化程序。虽然@pirho的答案似乎是适用的,但我发现了一个不同的简单解决方案,它对我很有效。希望它也能帮助其他人
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(JacksonConverterFactory.create(mapper))
.client(okHttpClient)
.build();
也许这会有帮助。请添加一些代码,至少是您的对象类谢谢。会不会碰巧有一段杰克逊的代码而不是格森的?