在Python 3.3中读取JSON文件的Estrange行为

Estrange behavior reading JSON files in Python 3.3

本问题已经有最佳答案,请猛点这里访问。

我使用"json"包读取json文件并转换为csv。几个月前,我用python 2.7编写了一个脚本,它提取了一个包含JSON文件中对象名称的字典(当时它工作得很好)。当我在python 3.3中运行脚本时,每次执行脚本时,检索对象的顺序是不同的。

知道为什么会这样吗?如何修复?

我的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
import json
import csv

   input_file = open('my_path\\json_file', 'r')
   myjson = json.load(input_f)
   input_f.close()
   new_json = myjson['markers'] #main object containing sub-objects

   keys = {} #empty dictionary to store list of sub-objects

   for i in new_json:
       for k in i.keys():
           keys[k] = 1

一些输出示例:

执行1:

1
KEYS{'': 1, 'latitude': 1, 'Particles': 1, 'Wind Speed': 1, 'image': 1, 'Humidity': 1, 'C/ Daoiz y Velarde': 1, 'Noise': 1, 'Battery level': 1, 'id': 1, 'Soil Moisture': 1, ....}

执行2:

1
KEYS{'': 1, 'Relative humidity': 1, 'N02': 1, 'Particles': 1, 'Rainfall': 1, 'image': 1, 'Odometer': 1, 'Co Index': 1, 'Wind Direction': 1, 'Atmospheric Pressure': 1, ....}


这就是字典现在在Python3中的工作方式。这是2.x中默认禁用的安全修补程序的结果。有关详细说明,请参阅此答案。

您可以通过使用object_pairs_hook关键字参数获得所需的行为。把它传给collections.OrderedDict类。您也可能希望将结果存储在ordereddict中。这里和这里都有记录。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import json
import csv
import collections

input_file = open('my_path\\json_file', 'r')
myjson = json.load(input_f, object_pairs_hook=collections.OrderedDict)
input_f.close()
new_json = myjson['markers'] #main object containing sub-objects

keys = collections.OrderedDict()

for i in new_json:
    for k in i.keys():
        keys[k] = 1


这是因为不能保证对python字典进行排序。使用ordereddict修复它:

1
2
3
4
5
6
7
8
9
10
11
12
import json
import csv
from collections import OrderedDict

input_file = open('my_path\\json_file, 'r')
myjson = OrderedDict(json.load(input_f))
input_f.close()
keys = {} #empty dictionary to store list of sub-objects

for i in new_json:
    for k in i.keys():
       keys[k] = 1