Python json.loads 改变对象的顺序
Posted
技术标签:
【中文标题】Python json.loads 改变对象的顺序【英文标题】:Python json.loads changes the order of the object 【发布时间】:2017-10-03 00:29:07 【问题描述】:我有一个包含 JSON 对象的文件。它已通过以下方式加载:
with open('data.json', 'r') as input_file:
input_data = input_file.read()
此时 input_data 只包含一个字符串,现在我继续将其解析为 JSON:
data_content = json.loads(input_data.decode('utf-8'))
data_content 具有我需要的字符串的 JSON 表示,但由于某种原因在 json.loads 之后我不清楚它正在改变键的原始顺序,例如,如果我的文件包含类似:
"z_id": 312312,
"fname": "test",
"program": "none",
"org": null
在 json.loads 之后,顺序被更改为如下内容:
"fname": "test",
"program": None,
"z_id": 312312,
"org": "none"
为什么会这样?有没有办法保留订单?我正在使用 Python 2.7。
【问题讨论】:
为什么需要字典顺序? 如果你真的需要订购,那么***.com/questions/6921699/… 我认为这是一个不好的例子,因为键是按字母顺序排列的。我将编辑示例。我的观点是我希望对象不被改变,而是保持它最初的顺序 如果需要订购,则使用Python3.6:***.com/q/39980323/7216865 另见: ***.com/questions/6921699 【参考方案1】:python 中的字典(对象)没有保证顺序。所以当解析成dict
时,顺序就丢失了。
如果由于某种原因顺序很重要,您可以让 json.loads
使用 OrderedDict
代替,这类似于 dict
,但会保存键的顺序。
from collections import OrderedDict
data_content = json.loads(input_data.decode('utf-8'), object_pairs_hook=OrderedDict)
【讨论】:
Since Python 3.7json.loads
preserves dict order by default.【参考方案2】:
这不是 json.load 的问题。 Python 中的字典不是强制执行顺序的,所以你会弄乱它;一般来说,没关系,因为你是基于字符串来访问元素的,比如"id"
。
【讨论】:
在这种情况下确实很重要,因为我必须将数据转储到 excel 文件中并且需要保留结构。我所有的文件都不会具有相同的结构,因此无法单独访问每个元素以上是关于Python json.loads 改变对象的顺序的主要内容,如果未能解决你的问题,请参考以下文章
python json.load和json.loads的区别
如何在Python中将json.loads作为列表而不是字典[重复]