我正在使用改造来调用REST服务(不是我的),该改造要么返回对象列表(如果有多个),要么返回一个对象列表(如果有)。我能够找到类似的问题here,但是建议是更改我无法控制的API。我还阅读了this线程,这似乎是一个很好的方法,但是有没有办法使用Retrofit处理它呢?
答案 0 :(得分:0)
您可以以Map<String, JsonElement>
的形式获取API响应数据作为响应,然后根据您的要求直接对其进行解析。正如您可以在此处检查JsonElement是否为JsonArray
例如:
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
}
}
答案 1 :(得分:0)
作为您提到的第二篇文章的作者,我还提到了answer of mine中描述的log.Logger
的实现。
将Gson与Retrofit(Retrofit的converter-gson)一起使用时,您只需要在自定义PostArrayOrSingleDeserializer
实例中注册适配器,并使用该Gson
实例构建Retrofit
实例,请参见以下示例助手类:
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);
}
}
的{{1}}中的Object
是您需要检查单个实例或数组的DTO。将JsonDeserializer
替换为相应的DTO并相应地修改反序列化器。
答案 2 :(得分:0)
虽然@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();