【问题标题】:How to convert Dynamic nested JSON to JAVA Object in android with GSON?如何使用 GSON 在 android 中将动态嵌套 JSON 转换为 JAVA 对象?
【发布时间】:2018-12-23 08:04:52
【问题描述】:

我正在尝试将以下 JSON 显示到我的 RecyclerView 并执行相应的操作。现在,问题是,如何从 JSON 对象和键中的值访问每个键。我需要将它们存储在带有 POJO 或数组的 Java 对象中吗?我从服务器收到以下响应,所以我不想静态存储它们,我想动态存储它。

我也在寻找相同的解决方案,但其中大多数都包含 JSONArray,而我的回复不包含任何 JSONArray。它包括键和 JSONObject 作为值。我也不懂java,我是webdev,找了一天了。

{
"response": {
    "status": 200,
    "result": {
        "17": {
            "key1": "3",
            "key2": "111111",
            "key3": "aaa",
            "key4": "sss",
            "key5": "aaa@asd.com",
            "key6": "1122334455",
            "key7": "2017-12-11",
            "key7": "something",
            "key9": "location"
        },
        "18": {
            "key1": "3",
            "key2": "111111",
            "key3": "aaa",
            "key4": "sss",
            "key5": "aaa@asd.com",
            "key6": "1122334455",
            "key7": "2017-12-11",
            "key7": "something",
            "key9": "location"
        },
        "19": {
            "key1": "3",
            "key2": "111111",
            "key3": "aaa",
            "key4": "sss",
            "key5": "aaa@asd.com",
            "key6": "1122334455",
            "key7": "2017-12-11",
            "key7": "something",
            "key9": "location"
        }
    }
  }
}

我在字符串中有 Result JSONObject,

  public void onResponse(JSONObject response) {
                String status = null;
                try {
                    JSONObject responseCode = response.getJSONObject("response");
                    status = responseCode.getString("result");
                    //Todo

                } catch (JSONException e) {
                    e.printStackTrace();
                    defaultView.setText("Json Error");
                }

                defaultView.setText(status);

            }

【问题讨论】:

标签: android json dynamic gson


【解决方案1】:

首先我猜你的例子"key7": "something"实际上应该是"key8.."

Gson 可以将任何有效的 JSON 解析为 LinkedTreeMap,然后您可以以任何您想要的方式循环。但是,您的响应在某种程度上似乎是静态的,因此您可以创建一个 DTO 以使访问值更容易一些。这个 DTO 可能是这样的:

@Getter
public class ResponseWrapper {
    @Getter
    public static class Response {
        private Integer status;
        private Map<Integer, Map<String, Object>> result;       
    }
    private Response response;
}

使用这种 DTO,您可以做 foo 示例(假设没有 Java8 和 Streams):

Response rw = new Gson().fromJson(RESPONSE_JSON, ResponseWrapper.class).getResponse();
Set<Entry<Integer, Map<String, Object>>> entries = rw.getResult().entrySet();
for(Entry<Integer, Map<String, Object>> e : entries) {
    Object o = e.getValue().get("key1");
    // do somethigs
}

如果您的示例的结果键 (17,18,19) 包含一组固定的键 - 所以只是从 key1 到 key9 具有相同的数据类型 - 您也可以为此创建一个单独的 DTO,例如:

@Getter
public class ResultItem {
    private Long key1;
    private Long key2;
    private String key3;
    private String key4;
    private String key5;
    private Long key6;
    private Date key7;
    private String key8;
    private String key9;
}

然后您对值的访问可能会更安全一点,例如:

for(Entry<Integer, ResultItem> e : entries) {
    Long longKey1 = e.getValue().getKey1();
    // do somethings
}

【讨论】:

    【解决方案2】:

    在乞求你可以需要创建你的 POJO,这个网站创建你的 POJO JsonToPojoLink

    那么您可以像这样使用 GSON:

       Gson gson = new Gson();
        ResponsePOJO responsePOJO;
        responsePOJO= gson.fromJson(response.toString(),ResponsePOJO.class);
    

    【讨论】:

      【解决方案3】:

      您有一个包含多个对象值的结果对象的响应。
      所以,你可以简单地应用一个逻辑,比如,

      JSONObject responseCode = response.getJSONObject("response");  
      JSONObject resultCode = responseCode.getJSONObject("result");
      
          if(resultCode.length >0){
              for(int i=0;i<resultCode;i++){
                  JSONObject listCode = resultCode.getJSONObject(i);
                  String keyVal_1=listCode.getString("key1");
      //store keyVal_1 in your arrayList and other keys 
      //it will work till the dynamically generated last object you store.
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2017-07-27
        • 2014-07-18
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多