【问题标题】:How to handle response which can be different Type in Retrofit 2如何处理Retrofit 2中可能不同类型的响应
【发布时间】:2016-09-02 08:16:20
【问题描述】:

在 WebApi 返回的 JSON 的字段可以是不同的类:

{ someField:"some string" }
{ someField: { "en" : "some string", "ka" : "რამე სტრინგი" } }

我看到了一些解决方案,但它是在以前版本的 Retrofit 上。

我的 pojo 类会是什么样子,我可以用什么来解析这个动态 json?

【问题讨论】:

  • JSON的键是动态的吗?
  • 是的,它可以为不同的响应使用不同的名称。基本上,每个字符串字段都可以变成第二种类型。
  • somefield 可以有任意数量,而里面的数据可以是任何东西吗?
  • 是的,这种类型的字段可以有任意数量,但里面的数据只能是这两种类型:字符串或对象
  • 你能告诉我,如果“somefield”是一个数组,那么是否至少有一个与直接父级同名的字段(在本例中为 somefield)?

标签: android json retrofit2


【解决方案1】:

对于您的情况,您可以使用 Call<JsonElement> 作为响应类型并在响应中解析它:

call.enqueue(new Callback<JsonElement>() {
        @Override
        public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
            if(response.isSuccessful()){
                JsonElement jsonElement = response.body();
                if(jsonElement.isJsonObject()){
                    JsonObject objectWhichYouNeed = jsonElement.getAsJsonObject();
                } 
                // or you can use jsonElement.getAsJsonArray() method
                //use any json deserializer to convert to your class.
            }
            else{
                System.out.println(response.message());
            }
        }
        @Override
        public void onFailure(Call<JsonElement> call, Throwable t) {
            System.out.println("Failed");
        }
    });

【讨论】:

  • 这个解决方案的问题是,我有太多的请求,每次都返回这种类型的字段。所以每次通话我都必须使用相同的代码。我想概括每个电话。
猜你喜欢
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 2020-09-22
  • 2018-05-26
  • 1970-01-01
相关资源
最近更新 更多