Python检索指定的嵌套JSON值



我有一个.json文件,其中有许多条目看起来像这样:

{
"name": "abc",
"time": "20220607T190731.442",
"id": "123",
"relatedIds": [
{
"id": "456",
"source": "sourceA"
},
{
"id": "789",
"source": "sourceB"
}
],
}

我将每个条目保存在一个python对象中,然而,我只需要源a的相关ID。问题是,源a的相关ID并不总是在嵌套列表的第一位。

因此data['relatedIds'][0]['id']不能可靠地产生正确的Id。

目前我正在解决这样的问题:

import json
with open("filepath", 'r') as file:
data = json.load(file)
for value in data['relatedIds']:
if(value['source'] == 'sourceA'):
id_from_a = value['id']
entry = Entry(data['name'], data['time'], data['id'], id_from_a)

我不认为这种方法是最佳的解决方案,虽然,特别是如果relatedIds列表变长,更多的条目追加到JSON文件。

有没有更复杂的方法从指定的源中挑出这个'id'值,而不循环遍历嵌套列表中的所有条目?

对于一个更简洁的解决方案,您可以尝试使用python的filter()函数和一个简单的lambda:

import json
with open("filepath", 'r') as file:
data = json.load(file)
filtered_data = filter(lambda a : a["source"] == "sourceA", data["relatedIds"])
id_from_a = next(filtered_data)['id']
entry = Entry(data['name'], data['time'], data['id'], id_from_a)

如果我误解了json文件的外观,请纠正我,但它似乎适合我。

一步一步地获取所有条目:

>>> data["relatedIds"]
[{'id': '789', 'source': 'sourceB'}, {'id': '456', 'source': 'sourceA'}]

接下来,为了只获取source=sourceA:

的条目
>>> [e for e in data["relatedIds"] if e["source"] == "sourceA"]
[{'id': '456', 'source': 'sourceA'}]

现在,因为你不想要整个条目,而只是ID,我们可以更进一步:

>>> [e["id"] for e in data["relatedIds"] if e["source"] == "sourceA"]
['456']

从那里,只抓取第一个ID:

>>> [e["id"] for e in data["relatedIds"] if e["source"] == "sourceA"][0]
'456'

你能得到任何生成你的。json文件,以产生relatedIds作为一个对象,而不是一个列表?

{
"name": "abc",
"time": "20220607T190731.442",
"id": "123",
"relatedIds": {
"sourceA": "456",
"sourceB": "789"
}
}

如果没有,我会说你被困在列表中循环,直到你找到你要找的东西。

最新更新