【问题标题】:How to call dynamic nested json object in retrofit如何在改造中调用动态嵌套 json 对象
【发布时间】:2019-09-09 09:09:45
【问题描述】:

如何使用改造在 android 中调用动态嵌套 json 对象。我有以下格式的 JSON 结果,我的问题是:我如何访问“类别”的内容,因为“食物”、“时尚”等是所有动态值?给我一个想法。


{
"offer": {
    "id": "JUN_HAIR_1302177631",
    "categories": {
        "electronics": {
            "address_1": "12 Mott St",
            "address_2": null,
            "city": "New York",
            "cross_streets": "Chatham Sq & Worth St",
            "state": "NY",
            "zip": "10013"
        },
        "food": {
            "address_1": "12 Mott St",
            "address_2": null,
            "city": "New York",
            "cross_streets": "Chatham Sq & Worth St",
            "state": "NY",
            "zip": "10013"
        },
        "fashion": {
            "address_1": "12 Mott St",
            "address_2": null,
            "city": "New York",
            "cross_streets": "Chatham Sq & Worth St",
            "state": "NY",
            "zip": "10013"
        },
        .........
        .........

    }
}
}

【问题讨论】:

  • 请贴出你试过的代码。
  • 给我一个开始的想法
  • 理想情况下,类别应该是一个 json 数组,并且内部对象需要有类似 category_name: xyz ..... 这将使模型更容易建模并且更动态

标签: java android json kotlin retrofit2


【解决方案1】:

你可以使用HashMap:

class Offer {
    private String id;
    private HashMap<String, Category> categories;

    // getters and setters
}

Category 数据类应如下所示:

class Category {
    @SerializedName("address_1")
    private String firstAddress;
    @SerializedName("address_2")
    private String secondAddress;
    private String city;
    @SerializedName("cross_streets")
    private String crossStreets;
    private String state;
    private String zip;

    // getters and setters;
}

【讨论】:

    【解决方案2】:

    使用 Iterator 获取类别对象的所有动态键。

    private void parseCategoriesJson(JSONObject data) {
    // here data is your categories object.
        if (data != null) {
            Iterator<String> it = data.keys();
            while (it.hasNext()) {
                String key = it.next();
                try {
                    JSONObject object=data.getJSONObject(key);
                    // object is your electronics,food,fashion
                } catch (Throwable e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用 Pojo 为您的 json 生成类。

      要遵循的步骤

      转到包 -> 新建 -> 选择从 JSON 生成 POJO

      如果选项未显示,则说明您尚未安装插件。

      进入项目设置 -> 插件 -> 安装 RoboPojoGenerator

      这将为每个 Json 对象生成 Java 类。例如下面

      public class Demo{
      
          @SerializedName("offer")
          @Expose
          private Offer offer;
      
          @SerializedName("id")
          private String id;
      
          @SerializedName("categories")
          private Categories categories;
      
          public void setOffer(Offer offer){
              this.offer = offer;
          }
      
          public Offer getOffer(){
              return offer;
          }
      
          public void setId(String id){
              this.id = id;
          }
      
          public String getId(){
              return id;
          }
      
          public void setCategories(Categories categories){
              this.categories = categories;
          }
      
          public Categories getCategories(){
              return categories;
          }
      
          @Override
          public String toString(){
              return 
                  "Offer{" + 
                  "offer = '" + offer + '\'' + 
                  ",id = '" + id + '\'' + 
                  ",categories = '" + categories + '\'' + 
                  "}";
              }
      }
      

      @SerializedName 和 @Expose 注释。

      这会解决你的问题。

      【讨论】:

      • 我相信你也应该给他 Categories 对象的 pojo
      【解决方案4】:

      这是该 json 所需的模型列表,您的模型应该是这样的:

      public class YourObject {
          @SerializedName("offer")
          private Offer offer;
      }
      
      public class Offer {
          @SerializedName("id")
          private String id;
          @SerializedName("categories")
          private Categories categories;
      }
      
      public class Categories {
          @SerializedName("electronics")
          private Electronics electronics;
          @SerializedName("food")
          private Food food;
          @SerializedName("fashion")
          private Fashion fashion;
      }
      
      public class Electronics {
          @SerializedName("address_1")
          private String address1;
          @SerializedName("address_2")
          private Object address2;
          @SerializedName("city")
          private String city;
          @SerializedName("cross_streets")
          private String crossStreets;
          @SerializedName("state")
          private String state;
          @SerializedName("zip")
          private String zip;
      }
      
      public class Fashion {
          @SerializedName("address_1")
          private String address1;
          @SerializedName("address_2")
          private Object address2;
          @SerializedName("city")
          private String city;
          @SerializedName("cross_streets")
          private String crossStreets;
          @SerializedName("state")
          private String state;
          @SerializedName("zip")
          private String zip;
      }
      
      public class Food {
          @SerializedName("address_1")
          private String address1;
          @SerializedName("address_2")
          private Object address2;
          @SerializedName("city")
          private String city;
          @SerializedName("cross_streets")
          private String crossStreets;
          @SerializedName("state")
          private String state;
          @SerializedName("zip")
          private String zip;
      }
      

      【讨论】:

      • 它们至少受到限制吗?如果是,您应该为每个对象添加所有模型,否则您可以使用 HashMap
      猜你喜欢
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2018-05-31
      相关资源
      最近更新 更多