当JsonObject的密钥被迭代时,它们的顺序与服务器的响应顺序不同

mas*_*ind 22 java json

我从JSON字符串的服务器得到了非常大的响应.我将它转换为JSON对象,然后获取密钥并迭代它.

问题是,当我迭代时,它的顺序与服务器的响应顺序不同.

接下来,我通过添加所有键List<String>并对其进行排序来应用另一种方法,然后获取其中的迭代器但仍然不是我需要的(如响应中).

代码示例如下:

JSONObject jsonObject = new JSONObject(responseString);
    Iterator<String> myIter = jsonObject.keys();


    List<String> sortKey = new ArrayList<String>();

    while(myIter.hasNext()){
        sortKey.add(myIter.next());
    }
    Collections.sort(sortKey);
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 18

JSON对象的键的顺序不应该是有意义的.如果需要特定订单,则应使用数组,而不是对象.

您的Java代码按字母顺序对键进行排序.无法获得对象中键的初始排序.

参考文献1:

键的顺序是未定义的

参考2:

对象是一组无序的名称/值对

  • 说实话,我不认为这个答案是100%正确的.例如,对于货币兑换阵列,它可以是{name - > info}对,名称可以按"重要"的方式排序,即USD是第1个等等.当然,您可以将这些paris放入数组条目中,但那时只有一个额外的巢.我的观点是,"词典"对象中的项目顺序可能有很多很好的理由.如果它不是json规范的一部分,那么规范是错误的,而不是人们想要保持他们的数据结构尽可能干净和简单. (3认同)

Geo*_*zov 17

您可以使用Sorted map将键和值放入.像这样的东西

 public static List listFromJsonSorted(JSONObject json) {
    if (json == null) return null;
    SortedMap map = new TreeMap();
    Iterator i = json.keys();
    while (i.hasNext()) {
        try {
            String key = i.next().toString();
            JSONObject j = json.getJSONObject(key);
            map.put(key, j);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    return new LinkedList(map.values());
}
Run Code Online (Sandbox Code Playgroud)