Python JSON 加载后字典乱序的解决方案与 loads/load 区别解析

周予安
周予安
发布时间:2026-10-13 | 5人浏览过
原创

Python 中 JSON 反序列化默认使用字典,因哈希特性可能导致键值顺序与原文不一致。本文介绍通过 collections.OrderedDict 保持顺序的方法,并详细区分 json.load 与 json.loads 在文件句柄与内存对象处理上的具体差异,提供完整代码示例。

Python JSON 字典乱序问题

Python 标准库中的 json 模块常用于处理 JSON 字符串,但在将其转换为字典对象时,有时会发现键值对的顺序与原始 JSON 字符串不一致。

这是因为 Python 中的字典(dict)基于哈希表实现,其内部存储顺序由 key 的哈希值决定,因此无法保证插入顺序或原始顺序。

乱序现象代码示例


import json

jsonstr = '{"username":"string","age":"int","income":"float","createdTime":"date"}'

print(json.loads(jsonstr))

这种无序性会导致多次解析同一 JSON 字符串时,输出的字典顺序可能不一致,进而影响依赖顺序的逻辑判断。

以下代码展示了直接解析 JSON 字符串的结果:

{'age': 'int', 'createdTime': 'date', 'username': 'string', 'income': 'float'}

在控制台执行上述代码后,观察到的输出顺序可能与原始字符串定义顺序不同。


>>> import json
>>> jsonstr = '{"username":"string","age":"int","income":"float","createdTime":"date"}'
>>> print(json.loads(jsonstr))
{'username': 'string', 'age': 'int', 'income': 'float', 'createdTime': 'date'}
>>>

使用 OrderedDict 保持顺序

为解决此问题,可以使用 collections 模块中的 OrderedDict(有序字典)来保持解析后的顺序,确保输出与输入一致。

dictStr = json.loads(jsonstr,object_pairs_hook=collections.OrderedDict)

json.load 与 json.loads 的区别

补充拓展:详细解析 json.load 和 json.loads 的区别

在 Python 中,json.load 和 json.loads 均用于实现反序列化操作,但二者处理的对象类型不同。

json.loads 处理内存字符串

json.loads 针对内存中的字符串对象,将 JSON 格式的字符串反序列化为 Python 内置的数据类型。

例如,若使用 json.dumps 将字典序列化为字符串 d_json=json.dumps({'a':1, 'b':2}),得到的结果是一个字符串变量 d_json,其内容如 串'{"b": 2, "a": 1}'。

此时,可以使用 json.loads 将该字符串重新反序列化为字典对象,如 d=json.loads(d_json) #{ b": 2, "a": 1}。

json.load 处理文件句柄

json.load 则专门针对文件句柄操作,直接从打开的文件中读取 JSON 数据并反序列化。

如果本地存在一个名为 a.json 的 JSON 文件,可以通过 d=json.load(open('a.json')) 的方式直接读取并解析。

相应地,dump 系列函数用于将 Python 内置类型序列化为 JSON 格式字符串后写入文件。

以上内容总结了 Python 中处理 JSON 数据时遇到的乱序问题及解决方案,并厘清了 load 与 loads 的使用场景,希望能为读者提供参考。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表