【问题标题】:Get a nested value from a json api从 json api 获取嵌套值
【发布时间】:2019-01-07 12:32:49
【问题描述】:

我有这个 json 代码

{
"status": "success",
"message": null,
"data": {
    "19": {
        "id": "19",
        "created": "2019-01-07 13:26:06",
        "createdby": 158,
        "touched": "2019-01-07 13:26:06",
        "touchedby": 158,
        "start": "2019-01-07",
        "end": "2019-01-08",
        "scoperole": 3,
        "scopecorp": 1,
        "body": "<p>test</p>",
        "language": "en"
    },
    "20": {
        "id": "20",
        "created": "2019-01-07 13:26:20",
        "createdby": 158,
        "touched": "2019-01-07 13:26:20",
        "touchedby": 158,
        "start": "2019-01-07",
        "end": "2019-01-08",
        "scoperole": 3,
        "scopecorp": 1,
        "body": "<p>test1</p>",
        "language": "en"
    }
},
"error": 0,
"line": 1515,
"debug": null

}

我想取 "body" (test,test1) 的值。 我怎样才能联系到他们?我留下了我试图查看它的代码,旁边有 //not working。有什么想法吗?另外 19,20 不一样,所以我无法通过仅输入变量名称来获取它们(例如 JSONObject dataObj =new JSONObject ("data");

这是我的代码

 private void getJson() {
        URL obj = null;
        try {
            obj = new URL("https://gekon.technologypark.cz/api/v1/notification/");
            HttpsURLConnection conn = (HttpsURLConnection) obj.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("ApiSecret", LoginInfo.ApiSecret);
            conn.connect();
            BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
            StringBuilder sb = new StringBuilder();
            String output;
            while ((output = br.readLine()) != null)
                sb.append(output);

            JSONObject jsonObj = new JSONObject(sb.toString());
            Log.d("test", "response" + jsonObj);

            JSONObject dataObj =new JSONObject("data");

            JSONObject dataObj19 =dataObj.getJSONObject("22");
            String body1 =dataObj19.getString("body");

            Log.d("test", "TEST ID" + body1);

            pushNotification(notifText);


        } catch (Exception e) {
            e.printStackTrace();
            Log.d("test", "PUSH CATCH" + e);

        }

    }

这是我的日志

**2019-01-07 14:17:42.778 19712-19712/ibm.gekon.vasileiosvlachakis.gekon D/alekos: 响应{"status":"success","message":null,"data":{"22":{"id":"22","created":"2019-01-07 14:11:55","createdby":158,"touched":"2019-01-07 14:11:55","touchedby":158,"start":"2019-01-07","end":"2019-01-08","scoperole":3,"scopecorp":1,"正文":"

test22

","language":"en"}},"error":0,"line":1515,"debug":null}

2019-01-07 14:17:42.785 19712-19712/ibm.gekon.vasileiosvlachakis.gekon D/alekos:PUSH CATCHorg.json.JSONException:类型的值数据 java.lang.String 无法转换为 JSONObject**

【问题讨论】:

标签: android json api


【解决方案1】:

这里可以获取body key的值。但这是特定于 19 和 20 JSON 对象

   JSONObject dataObj = new 
   JSONObject(sb.toString()).getJSONObject("data");

    JSONObject dataObj19 =dataObj.getJSONObject("19");
    String body1 =dataObj19.getString("body");

    JSONObject dataObj20 =dataObj.getJSONObject("20");
    String body2 =dataObj20.getString("body");

如果 Response 在 data JSON 对象中有多个 JSON 对象,那么您需要一个循环来检索它

JSONObject dataObj =new JSONObject("data");
for(int i=0;i<dataObj.length();i++){
  JSONObject data =dataObj.getJSONObject(i);
        String body =data .getString("body");
}

【讨论】:

  • 我试过你的第一个答案,它给了我这个org.json.JSONException: Value data of type java.lang.String cannot be converted to JSONObject
  • @AlexKolydas 在添加后更新您的代码。我认为你在其他地方做错了。
  • @AlexKolydas 你没有得到data 对象,因为你没有通过响应解析它..
【解决方案2】:
JSONObject json = new JSONObject(sb.toString());
String statistics = json.getString("data");

for(Iteraor key=json.keys();key.hasNext();) {
    JSONObject keyValue = json.get(key.next());
     //now keyValue contains the 19,20 and so on... 
      String body1 =keyValue.getString("body");
      Log.d("test", "TEST ID" + body1);
}

试试这个可能有用。

【讨论】:

    【解决方案3】:

    最好的方法是制作静态键,但你可以获取所有键,然后为每个键获取值

    使用

     JSONObject dataObj =new JSONObject("data");
    
            Iterator<String> keys=dataObj.keys();
    
            while (keys.hasNext())
            {
                JSONObject currentObject =dataObj.getJSONObject(keys.next());
                String currentBody =currentObject.getString("body");
    
                Log.d("test", "TEST ID" + currentBody);
    
            }`
    

    【讨论】:

      【解决方案4】:

      在 JSON 响应中,您的密钥应该始终是静态的,以便从密钥中获得特定的响应。

      在这里检查您的数据JSONObject 是否包含该键以进行错误处理。

          try {
             JSONObject jsonObj = new JSONObject(sb.toString());// assuming this as your main JSONObject
              if(jsonObj.has("data")){
                  JSONObject dataObj =jsonObj.getJSONObject("data");
                      if(dataObj.has("19")){
                          JSONObject json19 = dataObj.getJSONObject("19");
      
                          // Now here check if the json19 contains the key that you want.
                          if(json19.has("body")){
                              String valueBody = json19.getString("body"); // this will give you the value of body
                          }
                      }
                   }
                  } catch (JSONException e) {
                      e.printStackTrace();
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多