Python-将JSON键/值转换为键/值,其中值是数组
我有一个JSON文件,其中有许多条目如下:Python-将JSON键/值转换为键/值,其中值是数组,python,json,Python,Json,我有一个JSON文件,其中有许多条目如下: { "area1": "California", "area2": "Sierra Eastside", "area3": "Bishop Area", "area4": "Volcanic Tablelands (Happy/Sad Boulders)", "area5": "Fish Slough Boulders", "grade": "V6 ", "route":
{
"area1": "California",
"area2": "Sierra Eastside",
"area3": "Bishop Area",
"area4": "Volcanic Tablelands (Happy/Sad Boulders)",
"area5": "Fish Slough Boulders",
"grade": "V6 ",
"route": "The Orgasm",
"type1": "Boulder",
"type2": "NONE",
"type3": "NONE",
"type4": "NONE",
},
我想将区域
和类型
条目转换为数组:
{
"area": ["California","Sierra Eastside","Bishop Area","Volcanic Tablelands (Happy/Sad Boulders)","Fish Slough Boulders"]
"grade": "V6 ",
"route": "The Orgasm",
"type": ["Boulder","NONE","NONE","NONE"]
},
我有一个几乎可以工作的代码:
json_data=open('../json/routes_test.json')
datas = json.load(json_data)
datas_arrays = []
area_keys = ['area1','area2','area3','area4','area5']
type_keys = ['type1','type2','type3','type4']
for data in datas:
areaArray = []
typeArray = []
deleteArray = []
for k, v in data.iteritems():
for area_key in area_keys:
if (k == area_key):
areaArray.append(v)
deleteArray.append(k)
for type_key in type_keys:
if (k == type_key):
typeArray.append(v)
deleteArray.append(k)
for k in deleteArray:
del data[k]
data['area'] = areaArray
data['type'] = typeArray
datas_arrays.append(data)
print datas_arrays
print "********"
out = json.dumps(datas_arrays, sort_keys=True,indent=4, separators=(',', ': '))
print out
f_out= open('../json/toues_test_intoarrays.json', 'w')
f_out.write(out)
f_out.close()
问题是
区域
数组都是无序的,类型
数组是向后的,这是我无法得到的。我觉得奇怪的是,一个是无序的,另一个是有序的,但却是反向的。在我看来,迭代应该确保它们是有序的。Python字典具有任意顺序,它们没有排序。您希望改用预构建的密钥列表:
with open('../json/routes_test.json') as json_data:
datas = json.load(json_data)
area_keys = ['area1','area2','area3','area4','area5']
type_keys = ['type1','type2','type3','type4']
for data in datas:
data['area'] = [data[k] for k in area_keys]
data['type'] = [data[k] for k in type_keys]
for k in area_keys + type_keys:
del data[k]
out = json.dumps(datas, sort_keys=True, indent=4, separators=(',', ': '))
print out
with open('../json/toues_test_intoarrays.json', 'w') as f_out:
f_out.write(out)
for k, v in sorted(data.iteritems()):
这会改变现有的词典
您甚至可以从每个条目中确定区域
和类型
键:
for data in datas:
keys = sorted(data.keys())
area_keys = [k for k in keys if k.startswith('area')]
data['area'] = [data[k] for k in area_keys]
type_keys = [k for k in keys if k.startswith('type')]
data['type'] = [data[k] for k in type_keys]
for k in area_keys + type_keys:
del data[k]
并用硬编码列表中的'area1'、'area2'等省略列表文字。按顺序迭代键
for k, v in sorted(data.iteritems()):
一旦你超过9,这将失败,但现在就可以了。比我的垃圾解决方案优雅得多。