【问题标题】:Parsing JSONObject having dynamic key解析具有动态键的 JSONObject
【发布时间】:2015-06-26 23:40:16
【问题描述】:

我有以下 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"
    }
}

验证:

如果它是 JSONArray,我会用 SO 的这个解决方案解析它:How to parse a JSON without key in android?

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

任何帮助表示赞赏。

【问题讨论】:

  • 是否需要获取JSONObject中的所有key?
  • 是的,所有键都有各自的值。

标签: android json


【解决方案1】:

但是我该如何解析这里的 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);
  }

【讨论】:

  • +1 让我知道 keys 的想法。我已经编辑了我的答案并考虑了Hashtableiterator 解决方案
  • 您好,这适用于 5+ 版本。在 kitkat 4.4 上它给出了错误的序列。我该怎么办?
  • @SAndroidD:如您所知,JSONObject 是unordered collection。让我知道您目前遇到的问题
  • 实际上是格式正确的我的 JSONObject 集合。但是当我在 Iterator 中获得键时,这些键不是按顺序排列的。对于 android 版本 5+ 工作完美
  • @SAndroidD:好的,为什么顺序很重要?如果您发布任何问题,请分享链接
【解决方案2】:

尝试将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;
    }
}

【讨论】:

    【解决方案3】:

    如果我是你并且我确定键是从 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作为下面的example

    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&lt;String&gt; 并将值添加到其中,而不是将它们添加到 HashTable

    【讨论】:

    • 感谢您的回复。我正在使用自定义类(bean)来存储类别列表而不是 HashMap
    【解决方案4】:

    试试这个代码

    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。也许这会对你有更多帮助。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多