使用python递归解析复杂的api json数据
方法,该方法将键作为输入,在整个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
{'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示例可能有助于找到列表为空的原因。您应该始终提供一个最少的数据示例,以便重现问题/缺陷并测试解决方案-您越容易为潜在的回答者提供答案,您可能得到的解决方案就越多。。请阅读。