解析具有动态键的JSONObject

5

我从服务器上得到了以下JSON响应。一开始,我认为它是无效的JSON,但在验证之后,它似乎是正确的:

JOSN: {
    "category": {
        "1": "World",
        "2": "Politics",
        "3": "Economy",
        "4": "Sports",
        "5": "Cricket",
        "6": "General",
        "7": "Business",
        "8": "Services",
        "9": "Law & Order",
        "10": "Entertainment"
    }
}

验证:JSON 验证

如果它是 JSONArray,我会使用这个来自 SO 的解决方案进行解析:如何在 Android 中解析没有键的 JSON?

但是我该如何解析我的 JSON?

非常感谢您的帮助。


你需要获取JSONObject中的所有键吗? - Ircover
是的,返回所有的键及其相应的值。 - GAMA
4个回答

16

那我该如何解析这里的JSON呢?

如果category JSONObject内的键是动态的,那么可以使用JSONObject.keys()获取Iterator来获取值,代码如下:

JSONObject mainJSONObj=new JSONObject(<json_string>);
// get category JSONObject from mainJSONObj
JSONObject categoryJSONObj=mainJSONObj.getJSONObject("category");

// get all keys from categoryJSONObj

Iterator<String> iterator = categoryJSONObj.keys();
  while (iterator.hasNext()) {
    String key = iterator.next();
    Log.i("TAG","key:"+key +"--Value::"+categoryJSONObj.optString(key);
  }

谢谢你提供“keys”想法的建议。我已经编辑了我的答案,并考虑了使用Hashtableiterator解决方案。 - Sami Eltamawy
嗨,这个在5个以上的版本上运行良好。但在KitKat 4.4上会出现错误的顺序。我该怎么办? - SAndroidD
@SAndroidD:正如您所知,JSONObject是一种“无序集合”。请告诉我您目前遇到的问题是什么。 - ρяσѕρєя K
实际上,我的JSONObject集合格式正确。但是当我在迭代器中获取键时,它们不是按顺序排列的。对于Android版本5+,运行完美。 - SAndroidD
@SAndroidD:好的,为什么顺序很重要?如果你发布了任何问题,请分享链接。 - ρяσѕρєя K
我需要它,谢谢。 - SAndroidD

12

尝试使用gson反序列化,将该类对象作为序列化输出类:

class MyClass {
    @SerializedName("category")
    private Map<String, String> categories;

    public Map<String, String> getCategories() {
       return categories;
    }

    public void setCategories(Map<String, String> categories) {
        this.categories = categories;
    }
}

1
如果我是你并且确信“钥匙是以1开头的数字序列”,我会执行以下操作:
Map<Integer, String> results = new Hashtable<>();

    try {
        //The response is your JSON as a string
        JSONObject obj = new JSONObject(response);
        JSONObject categories = obj.getJSONObject("categories");

        int counter = 1;
        //Breakable infinite loop, will be broken when you try to get non existing item
        while(true){
            results.put(counter, categories.getString(counter+""));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
//Return the map that contain the results
 return results;

或者使用 Iterator,如下所示 示例

Map<Integer, String> results = new Hashtable<>();

    try {
        //The response is your JSON as a string
        JSONObject obj = new JSONObject(response);
        JSONObject categories = obj.getJSONObject("categories");

        Iterator<String> iter = categories.keys();
        while (iter.hasNext()) {
            String key = iter.next();
            results.put(key, categories.getString(key+""));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    //Return the map that contain the results
    return results;

您也可以创建一个ArrayList<String>,并将值添加到其中,而不是将它们添加到HashTable中。

谢谢回复。我正在使用自定义类(bean)来存储类别列表,而不是HashMap。 - GAMA

0

尝试运行这段代码

JSONObject obj = result.getJSONObject("category");
    Iterator keys = obj.keys();

    while (keys.hasNext()) {
        // loop to get the dynamic key
        String dynamicKey = (String) keys.next();

        String value= obj.getString(dynamicKey);
    }

欲了解更多信息,请查看link。或许这会对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接