【问题标题】:Loop only looks at first row of JSON data循环只查看第一行 JSON 数据
【发布时间】:2022-01-26 21:47:36
【问题描述】:

我有一个比发布函数更复杂的循环 JSON 数据的函数。但问题在这里应该很明显。

for loop 仅查看 JSON 数据的第一行,它没有我正在寻找的参数,因此它在解析 JSON 数据的第一行后立即停止。我希望它继续循环遍历数据中的每一行,直到它找到我传入的value_id,它确实存在 JSON 数据向下几行。

是否有一些我在这里遗漏的简单修改可以使这成为可能?

def get_values(value_id):
    identifier = None
    data = api_grabber.get_value_data()
    for row in data["data"]:
        if row["department"]["segment"]["data"]["id"] == value_id
            break
    if identifier is None:
        return

【问题讨论】:

    标签: python json for-loop


    【解决方案1】:

    您必须递归搜索 JSON 对象才能找到所需的密钥。代码搜索所有级别以找到匹配的键。以下代码改编自Stack answer

    def get_values(json_input, lookup_key):
        if isinstance(json_input, dict):
            for k, v in json_input.items():
                if k == lookup_key:
                    yield v
                else:
                    yield from get_values(v, lookup_key)
        elif isinstance(json_input, list):
            for item in json_input:
                yield from get_values(item, lookup_key)
    

    例如,

    dict_test = {
        "id": "0001",
        "type": "donut",
        "name": "Cake",
        "ppu": 0.55,
        "batters":
            {
                "batter":
                    [
                        { "id": "1001", "type": "Regular" },
                        { "id": "1002", "type": "Chocolate" },
                        { "id": "1003", "type": "Blueberry" },
                        { "id": "1004", "type": "Devil's Food" }
                    ]
            },
        "topping":
            [
                { "id": "5001", "type": "None" },
                { "id": "5002", "type": "Glazed" },
                { "id": "5005", "type": "Sugar" },
                { "id": "5007", "type": "Powdered Sugar" },
                { "id": "5006", "type": "Chocolate with Sprinkles" },
                { "id": "5003", "type": "Chocolate" },
                { "id": "5004", "type": "Maple" }
            ]
    }
    
    print(list(get_values(dict_test, "id")))
    

    输出:

    ['0001',
     '1001',
     '1002',
     '1003',
     '1004',
     '5001',
     '5002',
     '5005',
     '5007',
     '5006',
     '5003',
     '5004']
    

    上面的输出显示了 所有级别中键 id 的匹配值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      相关资源
      最近更新 更多