为何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里的键顺序没有关联。
要解决这个问题,有两种可靠方式:
- 改用有序Map存储:部分JSON库支持配置解析时使用
LinkedHashMap(它会保留插入顺序),比如org.json可以通过指定构造参数实现;或者替换为Jackson、Gson这类库,通过配置序列化/反序列化规则来保留键的原始顺序。 - 直接指定键获取值:如果只需要固定输出
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
相关产品推荐
相关产品推荐

