如何使用改型处理对象列表或单个对象的JSON响应?

时间:2019-01-08 16:02:22

标签: android arrays json rest retrofit

我正在使用改造来调用REST服务(不是我的),该改造要么返回对象列表(如果有多个),要么返回一个对象列表(如果有)。我能够找到类似的问题here,但是建议是更改我无法控制的API。我还阅读了this线程,这似乎是一个很好的方法,但是有没有办法使用Retrofit处理它呢?

3 个答案:

答案 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 

  }

}

JsonElement ref

使用Gson获取list个项目或单个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();