【问题标题】:parsing complex api json data recursively using python [closed]使用python递归解析复杂的api json数据[关闭]
【发布时间】:2019-08-28 18:32:19
【问题描述】:

以key为输入并在整个json数据中搜索该key并返回该key的键值对列表的方法

此方法适用于普通键值对 {'key':'some value'} 但如果键的值是列表或字典 {'keya':[1,2,3]} 它返回空列表

filedata=open('testdata.json','r')
filedata=json.loads(filedata)
def extract_values(obj, key):
"""Pull all values of specified key from nested JSON."""
arr = []

def extract(obj, arr, key):
    """Recursively search for values of key in JSON tree."""
    if isinstance(obj, dict):
        for k, v in obj.items():
            if isinstance(v, (dict, list)):
                extract(v, arr, key)
            elif k == key:
                arr.append(v)
    elif isinstance(obj, list):
        for item in obj:
            extract(item, arr, key)
    return arr

results = extract(obj, arr, key)
return results
z=extract_values(filedata,'text')
print(z)

【问题讨论】:

  • 这里,一个可重现的 JSON 示例可能有助于找出列表为空的原因。
  • 欢迎来到 SO。您应该始终包含数据的最小示例,以便可以重现问题/缺陷并测试解决方案 - 您越容易为潜在的回答者提供更多解决方案。请阅读minimal reproducible example.

标签: python json rest recursion


【解决方案1】:

你可以使用一个函数,如果给定的对象是一个字典,如果给定的键存在于字典中,则产生值,然后递归地从字典值产生,或者如果对象是列表,则从列表项产生:

def extract(obj, key):
    if isinstance(obj, dict):
        if key in obj:
            yield obj[key]
        for k, v in obj.items():
            yield from extract(v, key)
    elif isinstance(obj, list):
        for i in obj:
            yield from extract(i, key)

所以给定:

d = {
    'a': [1, 2, 3],
    'b': {'a': 'c'},
    'c': [
        {'a': 'd'},
        {'b': 'e'}
    ]
}

list(extract(d, 'a')) 返回:

[[1, 2, 3], 'c', 'd']

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多