【问题标题】:Python retrieve specified nested JSON valuePython 检索指定的嵌套 JSON 值
【发布时间】:2022-06-13 22:40:07
【问题描述】:

我有一个包含许多条目的 .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)

我不认为这种方法是最佳解决方案,特别是如果相关 ID 列表变得更长并且附加到 JSON 文件的条目更多。

有没有一种更复杂的方法可以从指定的源中挑选出这个“id”值而不循环遍历该嵌套列表中的所有条目?

【问题讨论】:

  • 相关的id排序了吗?在任何情况下,您都可以在找到它后添加break 语句

标签: python json for-loop nested-lists


【解决方案1】:

要获得更简洁的解决方案,您可以尝试使用 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 文件的外观,请纠正我,但它似乎对我有用。

【讨论】:

    【解决方案2】:

    一次一步,以获取所有条目:

    >>> 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'
    

    【讨论】:

      【解决方案3】:

      你能得到任何生成你的 .json 文件的东西来生成相关 ID 作为一个对象而不是一个列表吗?

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

      如果没有,我会说你一直在循环遍历列表,直到找到你要找的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多