【问题标题】:How to handle JSON response of either a list of objects or a single object using retrofit?如何使用改造处理对象列表或单个对象的 JSON 响应?
【发布时间】:2019-06-03 08:41:30
【问题描述】:

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

【问题讨论】:

标签: android arrays json rest retrofit


【解决方案1】:

虽然@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();

【讨论】:

    【解决方案2】:

    您可以将API响应数据作为Map<String, JsonElement>作为响应,然后直接根据您的要求进行解析。你可以在这里检查 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

    【讨论】:

      【解决方案3】:

      作为您提到的第二篇文章的作者,我还参考了answer of mine 中描述的PostArrayOrSingleDeserializer 的实现。

      当使用带有 Retrofit 的 Gson(Retrofit 的转换器-gson)时,您只需使用自定义 Gson 实例注册适配器并使用该 Gson 实例构建 Retrofit 实例,请参见下面的示例帮助程序类:

      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 中名为 ObjectArrayOrSingleDeserializerObject 是您需要检查单个实例或数组的 DTO。将Object替换为对应的DTO,并相应修改解串器。

      【讨论】:

      • 谢谢。会不会碰巧有一个杰克逊的代码 sn-p 而不是 Gson?
      猜你喜欢
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多