使用python递归解析复杂的api json数据

使用python递归解析复杂的api json数据,python,json,rest,recursion,Python,Json,Rest,Recursion,方法,该方法将键作为输入,在整个json数据中搜索该键,并返回该键的键值对列表 此方法适用于正常的键值对{'key':'some value'}但如果键的值是list或dictionary{'keya':[1,2,3]}则返回空列表 filedata=open('testdata.json','r') filedata=json.loads(filedata) def extract_values(obj, key): """Pull all values of specified key fr

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

此方法适用于正常的键值对
{'key':'some value'}
但如果键的值是list或dictionary
{'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)

如果给定对象是dict,则可以使用以下函数:如果给定键存在于dict中,则生成值,然后从dict值递归生成;如果对象是列表,则从列表项生成:

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(摘录(d,'a'))
返回:

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

这里,一个可复制的JSON示例可能有助于找到列表为空的原因。您应该始终提供一个最少的数据示例,以便重现问题/缺陷并测试解决方案-您越容易为潜在的回答者提供答案,您可能得到的解决方案就越多。。请阅读。