2017-05-04 31 views
2

的顺序。它被装载方式如下:Python的json.loads改变我有一个包含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。

+2

为什么你需要字典顺序? –

+1

如果你确实需要的命令,那么http://stackoverflow.com/questions/6921699/can-i-get-json-to-load-into-an-ordereddict-in-python – tdelaney

+0

我认为这是一个坏榜样,因为钥匙按字母顺序排列。我将编辑示例。我的意思是我想要的对象没有改变,但持有什么顺序它最初曾 – Sebastian

回答

8

词典(对象)在python没有保证的顺序。所以当解析成dict时,订单就会丢失。

如果订单因某种原因很重要,您可以让json.loads改为使用OrderedDict,这与dict类似,但是保存了按键的顺序。

from collections import OrderedDict 

data_content = json.loads(input_data.decode('utf-8'), object_pairs_hook=OrderedDict) 
+0

是的,这解决了这个问题。非常感谢先生! – Sebastian

+1

哇!经过一整天的调试,这对我有效。下午我可以给你买冰淇淋。 – kevthanewversi

4

这不是json.load的问题。 Python中的字典不是强制执行的,所以你会把它搞乱。一般来说,这并不重要,因为您访问基于字符串的元素,如"id"

+0

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

相关问题