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.7 json.loads preserves dict order by default.【参考方案2】:

这不是 json.load 的问题。 Python 中的字典不是强制执行顺序的,所以你会弄乱它;一般来说,没关系,因为你是基于字符串来访问元素的,比如"id"

【讨论】:

在这种情况下确实很重要,因为我必须将数据转储到 excel 文件中并且需要保留结构。我所有的文件都不会具有相同的结构,因此无法单独访问每个元素

以上是关于Python json.loads 改变对象的顺序的主要内容,如果未能解决你的问题,请参考以下文章

python json.load和json.loads的区别

python 解析json loads dumps

如何在Python中将json.loads作为列表而不是字典[重复]

python的json模块的dumps,loads,dump,load方法介绍

json.loads和json.load的区别

python爬虫的一个问题,json.loads()不式转化字符串为dict类型吗?