【问题标题】:Getting JSONObject from JSONArray [duplicate]从 JSONArray 获取 JSONObject [重复]
【发布时间】:2011-11-29 21:00:50
【问题描述】:

我正在对作为服务器响应的 JSONObject 进行一些修复。

jsonObj = new JSONObject(resultString);
            JSONObject sync_reponse = jsonObj.getJSONObject("syncresponse");
            String synckey_string = sync_reponse.getString("synckey");
            JSONArray createdtrs_array = sync_reponse.getJSONArray("createdtrs");
            JSONArray modtrs_array = sync_reponse.getJSONArray("modtrs");
            JSONArray deletedtrs_array = sync_reponse.getJSONArray("deletedtrs");
            String deleted_string = deletedtrs_array.toString();

{"syncresponse":{"synckey":"2011-09-30 14:52:00","createdtrs":[],"modtrs":[],"deletedtrs":[{"companyid":"UTB17","username":"DA","date":"2011-09-26","reportid":"31341"}]

正如您在收到的响应中看到的那样,我正在解析 JSONObject 并创建同步响应,synckey 作为 JSON 对象 createdtrs、modtrs、deletedtrs 作为 JSONArray .我想从 deletedtrs 访问 JSONObject,以便我可以将它们分开并使用这些值。即我想提取 companyid、用户名、日期等。

我该怎么办?

感谢您的意见。

【问题讨论】:

  • new JSONObject(Sync_jsonString).optJSONObject("synckey").optJSONArray("deletedtrs").optJSONObject(0);
  • 查看此 Android JSON 解析教程:goo.gl/l4VoM
  • 你用的是什么库?

标签: java android json


【解决方案1】:

JSONArray 对象有一个函数getJSONObject(int index),你可以通过编写一个简单的for循环来遍历所有的JSONObjects:

JSONArray array;
for(int n = 0; n < array.length(); n++)
{
    JSONObject object = array.getJSONObject(n);
    // do some stuff....
}

【讨论】:

  • @Lars 我知道这已经很老了,但是对于仍然需要它并来到这里的任何人:将JSONObject object; 放在循环之前会不会更好(性能/内存方面),并且只需覆盖现有对象而不是创建大量临时对象?
  • @BenjaminSchwalb 你是对的,那样会更好。我这样写是为了可读性和清晰性,但是当您在自己的代码中实现它时,您的添加会使其更高效
  • 显示错误 - 无法从 JSONArray 类型对非静态方法 getJSONObject(int) 进行静态引用。
  • JSONArray 替换为您的JSONArray 对象的名称。例如JSONArray array 表示您输入JSONObject object = array.getJSONObject(n)JSONArray.length() 也是如此)
  • 你在说什么库? JSONObject,好的,但是来自哪个库?
【解决方案2】:

这是你的 json:

{
    "syncresponse": {
       "synckey": "2011-09-30 14:52:00",
        "createdtrs": [

        ],
        "modtrs": [

        ],
        "deletedtrs": [
          {
           "companyid": "UTB17",
           "username": "DA",
           "date": "2011-09-26",
           "reportid": "31341"
      }
       ]
   }
}

它正在解析:

JSONObject object = new JSONObject(result);
String syncresponse = object.getString("syncresponse");
JSONObject object2 = new JSONObject(syncresponse);
String synckey = object2.getString("synckey");
JSONArray jArray1 = object2.getJSONArray("createdtrs");
JSONArray jArray2 = object2.getJSONArray("modtrs");
JSONArray jArray3 = object2.getJSONArray("deletedtrs");
for(int i = 0; i < jArray3 .length(); i++)
{
   JSONObject object3 = jArray3.getJSONObject(i);
   String comp_id = object3.getString("companyid");
   String username = object3.getString("username");
   String date = object3.getString("date");
   String report_id = object3.getString("reportid");
}

【讨论】:

  • 我在你的 jsonarrat 循环中有一个问号,如果另一个迭代将覆盖之前的 object3 以及 comp-id、用户名、日期和报告 ID 变量,为什么还要循环。
【解决方案3】:
JSONArray deletedtrs_array = sync_reponse.getJSONArray("deletedtrs");

for(int i = 0; deletedtrs_array.length(); i++){

            JSONObject myObj = deletedtrs_array.getJSONObject(i);
}

【讨论】:

    【解决方案4】:
    {"syncresponse":{"synckey":"2011-09-30 14:52:00","createdtrs":[],"modtrs":[],"deletedtrs":[{"companyid":"UTB17","username":"DA","date":"2011-09-26","reportid":"31341"}]
    

    获取companyid、用户名、日期;

    jsonObj.syncresponse.deletedtrs[0].companyid
    jsonObj.syncresponse.deletedtrs[0].username
    jsonObj.syncresponse.deletedtrs[0].date
    

    【讨论】:

      【解决方案5】:

      开始

      JSONArray deletedtrs_array = sync_reponse.getJSONArray("deletedtrs");
      

      您可以遍历 JSONArray 并直接使用值或创建自己类型的对象
      它将处理每个 deletedtrs_array 成员内部的数据字段

      迭代

      for(int i = 0; i < deletedtrs_array.length(); i++){
          JSONObject obj = deletedtrs_array.getJSONObject(i);
          Log.d("Item no."+i, obj.toString());
      
          // create object of type DeletedTrsWrapper like this
          DeletedTrsWrapper dtw = new DeletedTrsWrapper(obj);
      
          // String company_id = obj.getString("companyid");
          // String username = obj.getString("username");
          // String date = obj.getString("date");
          // int report_id = obj.getInt("reportid");
      }
      

      自己的对象类型

      class DeletedTrsWrapper {
      
          public String company_id;
          public String username;
          public String date;
          public int report_id;
      
          public DeletedTrsWrapper(JSONObject obj){
              company_id = obj.getString("companyid");
              username = obj.getString("username");
              date = obj.getString("date");
              report_id = obj.getInt("reportid");
          }
      }
      

      【讨论】:

      • 嗨,我对这里的 json 有疑问 var 的值是什么。结果这一行JSONObject object = new JSONObject(result);我是新手。即使是关于解析json的链接也会帮助我谢谢你
      【解决方案6】:

      使用 google gson 库时。

      var getRowData =
      [{
          "dayOfWeek": "Sun",
          "date": "11-Mar-2012",
          "los": "1",
          "specialEvent": "",
          "lrv": "0"
      },
      {
          "dayOfWeek": "Mon",
          "date": "",
          "los": "2",
          "specialEvent": "",
          "lrv": "0.16"
      }];
      
          JsonElement root = new JsonParser().parse(request.getParameter("getRowData"));
           JsonArray  jsonArray = root.getAsJsonArray();
           JsonObject  jsonObject1 = jsonArray.get(0).getAsJsonObject();
           String dayOfWeek = jsonObject1.get("dayOfWeek").toString();
      

      //当使用jackson库时

          JsonFactory f = new JsonFactory();
                    ObjectMapper mapper = new ObjectMapper();
                JsonParser jp = f.createJsonParser(getRowData);
                // advance stream to START_ARRAY first:
                jp.nextToken();
                // and then each time, advance to opening START_OBJECT
               while (jp.nextToken() == JsonToken.START_OBJECT) {
                  Map<String,Object> userData = mapper.readValue(jp, Map.class);
                  userData.get("dayOfWeek");
                  // process
                 // after binding, stream points to closing END_OBJECT
              }
      

      【讨论】:

        【解决方案7】:

        尽量使用AndroidVolly库。它将您的 JSON 响应映射到相应的类对象中。您可以为该响应模型对象添加 getter setter。然后您可以像普通的 JAVA 对象一样使用 .operator 访问这些 JSON 值/参数。它使响应处理变得非常简单。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多