You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Java迭代器输出JSON中Map元素时顺序与预期相反?

问题:JSON解析中Map元素迭代顺序与预期不符

现有一段用于遍历JSON文件的Java代码:

Java代码

// 获取phoneNumbers
JSONArray ja = (JSONArray) jo.get("phoneNumbers");//jo为给定JSON对应的JSONObject 
// 遍历phoneNumbers
Iterator itr2 = ja.iterator();
  
while (itr2.hasNext()) 
{
    Iterator<Map.Entry>itr1 = ((Map)itr2.next()).entrySet().iterator();
    while (itr1.hasNext()) {
        Map.Entry pair = itr1.next();
        System.out.println(pair.getKey() + " : " + pair.getValue());
    }
}

JSON文件

{
    "firstName": "Souvik",
    "lastName": "Dey",
    "address": {
        "streetAddress": "D P Rd",
        "city": "Barasat",
        "state": "WB",
        "postalCode": 700126
    },
    "age": 23,
    "phoneNumbers": [
        {
            "type": "personal",
            "number": "#######23"
        },
        {
            "type": "office",
            "number": "########"
        }
    ]
}

实际输出

number : #######23
type : personal
number : ########
type : office

预期输出

type : personal
number : #######23
type : office
number : ########

为何迭代器输出Map元素的顺序与预期相反?


原因及解决办法

你使用的JSON解析库(比如常见的org.json)默认会把JSON对象解析成HashMap,而HashMap本身是无序容器,它不会保留JSON文本中键值对的原始书写顺序。遍历HashMap.entrySet()时的输出顺序,完全由哈希表的内部存储逻辑决定,和JSON里的键顺序没有关联。

要解决这个问题,有两种可靠方式:

  1. 改用有序Map存储:部分JSON库支持配置解析时使用LinkedHashMap(它会保留插入顺序),比如org.json可以通过指定构造参数实现;或者替换为Jackson、Gson这类库,通过配置序列化/反序列化规则来保留键的原始顺序。
  2. 直接指定键获取值:如果只需要固定输出type和number,完全可以跳过遍历Map的步骤,直接按指定键从子对象中取值,代码更简洁还能保证顺序:
while (itr2.hasNext()) {
    JSONObject phoneObj = (JSONObject) itr2.next();
    System.out.println("type : " + phoneObj.get("type"));
    System.out.println("number : " + phoneObj.get("number"));
}

内容的提问来源于stack exchange,提问作者Souvik Dey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:52:48