根据条件替换JSON字符串中的信息
我有一个非常大的json文件,里面有很多嵌套的键。从我目前了解到的,如果你这样做:
x = json.loads(data)
Python会把它当作一个字典来理解(如果我说错了请纠正我)。在这个json文件的第四层嵌套中,有几个元素是用ID号码命名的,所有这些元素都有一个叫做children的元素,类似这样:
{"level1":
{"level2":
{"level3":
{"ID1":
{"children": [1,2,3,4,5]}
}
{"ID2":
{"children": []}
}
{"ID3":
{"children": [6,7,8,9,10]}
}
}
}
}
我需要做的是,如果ID号码在一个叫做new_ids
的列表里,就把所有"children"
元素里的内容替换成空,也就是变成"children": []
,然后再把它转换回json格式。我已经研究这个问题几个小时了,但还没找到类似的解决办法来帮助自己。
我使用的是Python 3.3.3。任何建议都非常感谢!!
谢谢!!
编辑
列表:
new_ids=["ID1","ID3"]
预期结果:
{"level1":
{"level2":
{"level3":
{"ID1":
{"children": []}
}
{"ID2":
{"children": []}
}
{"ID3":
{"children": []}
}
}
}
}
2 个回答
0
如果你有一个简单的字典,比如这样:
data_dict = {
"level1": {
"level2":{
"level3":{
"ID1":{"children": [1,2,3,4,5]},
"ID2":{"children": [] },
"ID3":{"children": [6,7,8,9,10]},
}
}
}
}
那么你只需要这个:
data_dict = {
"level1": {
"level2":{
"level3":{
"ID1":{"children": [1,2,3,4,5]},
"ID2":{"children": [] },
"ID3":{"children": [6,7,8,9,10]},
}
}
}
}
new_ids=["ID1","ID3"]
for idx in new_ids:
if idx in data_dict['level1']["level2"]["level3"]:
data_dict['level1']["level2"]["level3"][idx]['children'] = []
print data_dict
'''
{
'level1': {
'level2': {
'level3': {
'ID2': {'children': []},
'ID3': {'children': []},
'ID1': {'children': []}
}
}
}
}
'''
但是如果你有一个更复杂的字典:
data_dict = {
"level1a": {
"level2a":{
"level3a":{
"ID2":{"children": [] },
"ID3":{"children": [6,7,8,9,10]},
}
}
},
"level1b": {
"level2b":{
"level3b":{
"ID1":{"children": [1,2,3,4,5]},
}
}
}
}
new_ids =["ID1","ID3"]
for level1 in data_dict.values():
for level2 in level1.values():
for level3 in level2.values():
for idx in new_ids:
if idx in level3:
level3[idx]['children'] = []
print data_dict
'''
{
'level1a': {
'level2a': {
'level3a': {
'ID2': {'children': []},
'ID3': {'children': []}
}
}
},
'level1b': {
'level2b': {
'level3b': {
'ID1': {'children': []}
}
}
}
}
'''
1
首先,你的JSON格式不正确。我猜你想要的是这个:
{"level1":
{"level2":
{"level3":
{
"ID1":{"children": [1,2,3,4,5]},
"ID2":{"children": []},
"ID3":{"children": [6,7,8,9,10]}
}
}
}
}
现在,把你的数据加载成一个字典:
>>> with open('file', 'r') as f:
... x = json.load(f)
...
>>> x
{u'level1': {u'level2': {u'level3': {u'ID2': {u'children': []}, u'ID3': {u'children': [6, 7, 8, 9, 10]}, u'ID1': {u'children': [1, 2, 3, 4, 5]}}}}}
接下来,你可以遍历 x['level1']['level2']['level3']
里的键,检查它们是否在你的 new_ids
列表中。
>>> new_ids=["ID1","ID3"]
>>> for key in x['level1']['level2']['level3']:
... if key in new_ids:
... x['level1']['level2']['level3'][key]['children'] = []
...
>>> x
{u'level1': {u'level2': {u'level3': {u'ID2': {u'children': []}, u'ID3': {u'children': []}, u'ID1': {u'children': []}}}}}
你现在可以像这样把 x
写回到一个文件中:
with open('myfile', 'w') as f:
f.write(json.dumps(x))
如果你的 new_ids
列表很大,可以考虑把它变成一个 set
类型。