我正在尝试解析API调用的输出,这是一个带有嵌套字典和列表的json对象,深度未知。我看到了几个递归函数的例子,它从嵌套的list / dict中获取一个键值,但我想获得特定的顺序以及结构的正确性。例如:
response = {'a': {'b': {'b1': 1, 'b2': 2},
'c': [{'c1': 3,'c2': [{'x':55,'y':56},{'x':65,'y':66}]},
{'c1': 5,'c2': [{'x':75,'y':76},{'x':85,'y':86}]}]
}
}
fun(response,"a-c-c2-x") should return [55,65,75,85]
fun(response,"a-b-b2") should return [2]
fun(response,"a-b2-b") should return []
到目前为止我所做的不起作用:)
def get_response_values(response=None, key=None, result=None):
print("1-r: {} - key: {} -r:{}".format(response, key, result))
if result is None:
result = []
if '-' in key:
if isinstance(response, dict):
index = key.find('-')
response = response[key[:index]]
key = key[index+1:]
print("3-r: {} - key: {} -r:{}".format(response, key, result))
get_response_values(response, key, result)
if isinstance(response, list):
index = key.find('-')
key = key[index+1:]
for item in response:
print("4-r: {} - key: {} -r:{}".format(item, key, result))
get_response_values(item, key, result)
else:
try:
result.append(response[key])
print("2-r: {} - key: {} -r:{}".format(response, key, result))
return result
except:
print("5-r: {} - key: {} -r:{}".format(response, key, result))
return result
return result
答案 0 :(得分:1)
您可以使用像jsonselect这样的库来实现JSON Select查询规范语言。
基本程序示例:
from jsonselect import select
result = select(query, data)
更新:或者看起来您也可以使用funcy的funcy.get_in()
功能。
不要重新发明轮子;有许多好的即用型解决方案。
更新#2:鉴于以下您的评论是一个更简单的理解和阅读示例,它可以让您80%的方式(不使用递归,冒着吹的风险堆栈!):
def query(data, path):
elem = data
try:
for x in path.strip("/").split("/"):
elem = elem.get(x)
except:
pass
return elem