【问题标题】:Android JSON parsing of multiple JSONObjects inside JSONObjectJSONObject内部多个JSONObjects的Android JSON解析
【发布时间】:2014-03-24 10:21:04
【问题描述】:

我有一个来自服务器的 JSON 字符串,它看起来像这样:

{
    "categories": {
        "0": {
            "term_id": "247",
            "name": "Content Curation"
        },
        "1": {
            "term_id": "50",
            "name": "Content Marketing"
        },
        "2": {
            "term_id": "2",
            "name": "Curation"
        },
        "3": {
            "term_id": "246",
            "name": "Inbound Marketing"
        },
        "4": {
            "term_id": "47",
            "name": "Marketing"
        },
        "5": {
            "term_id": "4",
            "name": "News Curation"
        },
        "6": {
            "term_id": "36",
            "name": "SEO"
        },
        "8": {
            "term_id": "248",
            "name": "Wordpress Content Curation"
        }
    }
}

我的任务是获取“term_id”和“name”字段的值。 我曾经使用以下代码从当前 JSONObject 获取“类别”对象:

JSONObject jObject = new JSONObject(responceData);
JSONObject categoryObject = jObject.getJSONObject("categories");
JSONArray  jarray = new JSONArray("["+categoryObject.toString().substring(1,categoryObject.toString().length() - 1) + "]");

for(int i=0;i<jarray.length();i++)
{
     JSONObject jobj = jarray.getJSONObject(i);
     String term_id=jobj.getString("term_id");
     String name=jobj.getString("name");
}

categoryObject 看起来像这样:

{
    "0": {
        "term_id": "247",
        "name": "Content Curation"
    },
    "1": {
        "term_id": "50",
        "name": "Content Marketing"
    },
    "2": {
        "term_id": "2",
        "name": "Curation"
    },
    "3": {
        "term_id": "246",
        "name": "Inbound Marketing"
    },
    "4": {
        "term_id": "47",
        "name": "Marketing"
    },
    "5": {
        "term_id": "4",
        "name": "News Curation"
    },
    "6": {
        "term_id": "36",
        "name": "SEO"
    },
    "8": {
        "term_id": "248",
        "name": "Wordpress Content Curation"
    }
}

但在那之后我不知道如何获取这些字段。有没有办法从 JSONObject 中获取所有 JSONObject 子对象?

如果你有源代码或者可以给我一个例子,请与我分享。

【问题讨论】:

  • 类别应该是数组。
  • 你能贴出你的服务器代码吗
  • @Dhaval 我无法访问服务器端,我正在远程解析它
  • 好的,你可以通过代码手动管理这个
  • 地狱签出已编辑的源代码

标签: java android json


【解决方案1】:

在这里你可以检索你所有的json数据,请求一个特定的key和innerKey来得到你想要的,干杯

    try
    {   
        String jsonString="";//your json string here
        JSONObject jObject= new JSONObject(jsonString).getJSONObject("categories");
        Iterator<String> keys = jObject.keys();
        while( keys.hasNext() )
        {
            String key = keys.next();
            Log.v("**********", "**********");
            Log.v("category key", key);
            JSONObject innerJObject = jObject.getJSONObject(key);
            Iterator<String> innerKeys = innerJObject.keys();
            while( innerKeys.hasNext() )
            {
                String innerKkey = keys.next();
                String value = innerJObject.getString(innerKkey);
                Log.v("key = "+key, "value = "+value);
            }
        }
    }
    catch (JSONException e)
    {   e.printStackTrace();    }

【讨论】:

  • 感谢您的帮助。附言通过使用您的代码,我找到了更好的解决方案。详情请查看我的回答。
  • 虽然这可能会回答 OP 的问题,但这种方式存在很大的性能漏洞,尤其是在处理大量记录的情况下。您可以从这里确认mkyong.com/java/…
  • 请将String innerKkey = keys.next();编辑为String innerKkey = innerKeys.next();
【解决方案2】:

检查this answer,这样你就不需要知道键,并且可以循环访问内部对象,但是类别作为 JSONArray 而不是对象会更好,这样你就可以正常循环遍历

for(int i = 0; i < array.length(); i++) {
    JSONObject obj = myArray.get(i);
    ....
}

【讨论】:

  • 谢谢,我会尝试答案中的代码并告诉你它是否有效。
  • 感谢您的帮助,我已经找到了解决方案,详情请查看我的回答...
【解决方案3】:

非常感谢 Ahmad Dwaik 和 Tom Hart 提供了答案。 这是解决方案的代码。

try
        {   

            JSONObject jObject= new JSONObject(responseData).getJSONObject("categories");
            Iterator<String> keys = jObject.keys();
            while( keys.hasNext() )
            {
                String key = keys.next();
                Log.v("**********", "**********");
                Log.v("category key", key);
                JSONObject innerJObject = jObject.getJSONObject(key);

                String name = innerJObject.getString("name");
                String term_id = innerJObject.getString("term_id");

                Log.v("name = "+name, "term_id = "+term_id);

            }
        }
        catch (JSONException e){
           e.printStackTrace();    
        }

【讨论】:

    【解决方案4】:

    使用 keys() 迭代器遍历所有属性,并为每个属性调用 get()。

    Iterator<String> iter = json.keys();
    while (iter.hasNext()) {
        String key = iter.next();
        try {
            Object value = json.get(key);
        } catch (JSONException e) {
            // Something went wrong!
        }
    }
    

    看到这个:https://stackoverflow.com/a/13573965/2480911

    【讨论】:

      【解决方案5】:

      试试这个

      JSONObject jObject = new JSONObject(responceData);
      JSONObject categoryObject = jObject.getJSONObject("categories");
      JSONObject obj0 = categoryObject.getJSONObject("0");
      String termId0 obj0.getString("term_id");
      String name0 obj0.getString("name");
      JSONObject obj1 = categoryObject.getJSONObject("1");
      String termId1 obj1.getString("term_id");
      String name1 obj1.getString("name");
      

      但我同意 wqrahd,类别应该是一个数组

      【讨论】:

      • 感谢您的回答,但这不是当前JSON的最佳解决方案,因为“0”和“1”是动态数字。
      【解决方案6】:

      虽然 Ahmad Dwaik 'Warlock' 提供了一个很好的答案,但他的代码中有一个错误,当前代码是 --

      try
      {   
          String jsonString="";//your json string here
          JSONObject jObject= new JSONObject(jsonString).getJSONObject("categories");
          Iterator<String> keys = jObject.keys();
          while( keys.hasNext() )
          {
              String key = keys.next();
              Log.v("**********", "**********");
              Log.v("category key", key);
              JSONObject innerJObject = jObject.getJSONObject(key);
              Iterator<String> innerKeys = innerJObject.keys();
              while( innerKeys.hasNext() )
              {
                  String innerKkey = innerKeys.next();  //Here was the error
                  String value = innerJObject.getString(innerKkey);
                  Log.v("key = "+key, "value = "+value);
              }
          }
      }
      catch (JSONException e)
      {   e.printStackTrace();    }
      

      【讨论】:

        【解决方案7】:

        试试这个 ->

        String response = data;
        JSONObject categories= new JSONObject(data).getJSONObject("categories").getJSONObject('0').getJSONObject('term_id');
        

        打印// 247

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多