根据条件替换JSON字符串中的信息

1 投票
2 回答
2847 浏览
提问于 2025-04-18 12:43

我有一个非常大的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 类型。

撰写回答