【发布时间】:2020-11-24 21:47:39
【问题描述】:
我有一个相当嵌套的 json 结构,我想循环并根据条件修改 ID 值。理想情况下,不需要键名,因为它们可以是可变的。我的想法是从顶层获取 Id 值,然后在整个 json 文件中搜索它并修改所有匹配的值,因为 ID 值始终相同。修改只是向其添加“_001”。但条件应该是它只在“类型”的子句中完成:“A”。 请参阅下面我正在处理的结构的示例 json:
{
"name1": "test1",
"Id": "12345678",
"data": [
{
"type": "A",
"Id1": "12345678",
"level2": {
"name2": "test2",
"Id2": "12345678",
"level3": {
"name3": "test3",
"Id3": "12345678"
},
"Edit": [
{
"Id": "12345678",
"Bla": "XXXXXXXXXX"
},
{
"Id": "12345678",
"Bla": "XXXXXXXXX"
}
]
}
},
{
"type": "B",
"id": "12345678",
"data": {
"Id": "12345678",
"Name": "test6"
}
}
]
}
如果“type”等于“A”,我想遍历这个 json 并替换 level1 内每个实例中的 Id 值,否则不需要遍历那个特定的 dict,这意味着不应该修改 ID。理想情况下,我会在顶层检查这个 id 值,然后按值而不是键进行过滤,因为键可能会有所不同(参见最低级别,其中称为“source_id”)。因此,在示例 json 中,子字典中带有“type”:“A”的所有 ID 都应该被替换,而带有“type”:“B”的 ID 应该保留。 作为输出,我想以相同的格式返回 json,只是更改了 ID。
到目前为止,我的代码仍然依赖于对键名的了解,并且没有捕获字典“编辑”列表中的 Id,因为我无法弄清楚在基于上述类型过滤器的嵌套字典:
data = json.load(open("test.json"))
curr_id = data['Id']
new_id = curr_id + '_001')
for item in data['data']:
if item['type'] != 'B':
item['Id1'] = new_id
item['level2']['Id2'] = new_id
item['level2']['level3']['Id3'] = new_id
【问题讨论】:
标签: json python-3.x