解析JSON数组中的动态对象数

时间:2014-03-31 07:22:05

标签: android json

我正在尝试解析一些JSON格式的文本,但我不太确定如何处理动态对象名称。我一直在网上寻找,从我所知道的这被称为java中的字典或MAP,但是我无法弄清楚如何处理动态长度。

我使用http://jsonlint.com/验证了我的JSON,我正在解析的代码如下。

{
"0": {
    "animal_name": "Yoshi",
    "animal_type": "Day Gecko",
    "animal_id": "1"
},
"1": {
    "animal_name": "Wigglesworth",
    "animal_type": "Bearded Dragon",
    "animal_id": "2"
},
"command": "login",
"owner_id": "1"

}

开始时有一些细节是静态的,然后返回动物,动物的数量是动态的。

我可以提取第一部分(Command和Owner_ID),我可以单独提取动物,但我不知道如何循环动物阵列。我不知道有多少动物,如果我试图动态地引用它们,它就会编译。

这是我用来从物体中抓取动物的代码,我只是在努力让它变得动态。 android json response key value, parsing

这与我在IOS上发布的另一个问题非常相似,所以我的解决方案有点发达,但仍然不太完善。 Parse nested JSON code in IOS

//parse the JSON header
JSONObject jo = new JSONObject(result);

//extract the owner id from the login response
owner_id=jo.getInt("owner_id");

//if the server throws an error, pass this back
if (!jo.isNull("error"))
{
    //store to global variable
    server_response=jo.getString("error");
}
else
{   //we only look for animals if a valid owner has logged in
    if (owner_id>0)
    {   //loop through the sub items.
        //HELP PLEASE: THE x<=5 needs to change to loop to the number of dictionary items in the JSONObject JO
        for(int x=0; x<=5; x++){
            //Extract each animal
            //HELP PLEASE: The jo.getJSONObject needs to get a dynamic item, but if I put x in here, it doesnt compile
            JSONObject animal = jo.getJSONObject("1");

            String animal_name = new String();
            String animal_type = new String();
            int animal_id = 0;

            //try and extract pets
            animal_name=animal.getString("animal_name");
            animal_type=animal.getString("animal_type");
            animal_id=animal.getInt("animal_id");

            //To Do: This code will overwrite each animal with the last. Need so store in an array.
            //get shared preferences object
            SharedPreferences prefs = a03_home_page.this.getSharedPreferences("my_app_name", Context.MODE_PRIVATE);

            //store the data
            prefs.edit().putString("animal_name", animal_name).commit();
            prefs.edit().putString("animal_type", animal_type).commit();
            prefs.edit().putInt("animal_id", animal_id).commit();

        }
    }
}

3 个答案:

答案 0 :(得分:0)

通常,我建议更改JSON以使用数组。

{
"animals": [
  {
    "animal_name": "Yoshi",
    "animal_type": "Day Gecko",
    "animal_id": "1"
  },
  {
    "animal_name": "Wigglesworth",
    "animal_type": "Bearded Dragon",
    "animal_id": "2"
  }, {... more animals ...}
],
"command": "login",
"owner_id": "1"
}

现在,您可以简单地将动态数量的动物添加到JSONArray&#34;动物&#34;并使用for-loopjsonArray.getJSONObject(i);

对其进行迭代

但是,如果您无法将json更改为您的目的,则可以迭代键:

Iterator keys = json.keys();
while(keys.hasNext()){
   JSONObject animal = json.getJSONObject(keys.next());
  // do smth
}

这种方法的问题是,你必须小心使用&#34;命令&#34;和&#34; owner_id&#34;,因为那不是json对象。所以你需要在while循环中使用更多的逻辑。

答案 1 :(得分:0)

您需要使用:

 Gson gson = new Gson();
    Object o = gson.fromJson(str, Object.class);
    List keys = new ArrayList();
    Collection values = null;
    if (o instanceof Map) {
        Map map = (Map) o;
        keys.addAll(map.keySet()); // collect keys at current level in hierarchy
        values = map.values();
    } else if (o instanceof Collection) {
        values = (Collection) o;
    }
    System.out.println(keys);// [CDG, ORY, LBG]
    for (int i = 0; i < keys.size(); i++) {
        System.out.println(keys.get(i));
    }

如此link

所示

答案 2 :(得分:0)

String result=yourjsondata.toString();  

首先像这样分配你的json数组

JSONArray jsar=new JSONArray(result);

然后解析像这样的对象

for(int i=0;i<jsar.length;i++)
{
JSONObject jsobj=new JSONObject(jsar[i]);

String strcode=jsobj.get("code");

String strrate=jsobj.get("rate");

String strtitle=jsobj.get("title");

String strsubtitle=jsobj.get("subtitle");
}