根据dict的结构对其进行导航



我有一个与多个API交互的python代码。所有的API都返回一些json,但每个都有不同的结构。假设我正在所有这些json中查找人名:

json_a = {
"people": [
{"name": "John"},
{"name": "Peter"}
]
}
json_b = {
"humans": {
"names": ["Adam", "Martin"]
}
}

正如您在上面看到的,jsons中的字典具有任意结构。我想把一些东西定义为";蓝图";对于导航每个json,类似于以下内容:

all_jsons = {
"json_a": {
"url": "http://endpoint",
"json_structure": "people -> list -> name"
},
"json_b": {
"url": "http://someotherendpoint",
"json_structure": "humans -> names -> list"
}
}

因此,如果我使用json_a,我只会研究all_jsons["json_a"]["json_structure"],并且我有关于如何导航这个确切json的信息。实现这一目标的最佳方式是什么?

为什么不为每个api定义具体的检索函数:

def retrieve_a(data):
return [d["name"] for d in data["people"]]
def retrieve_b(data):
return data["humans"]["names"]

并为每个端点存储它们:

all_jsons = {
"json_a": {
"url": "http://endpoint",
"retrieve": retrieve_a
},
"json_b": {
"url": "http://someotherendpoint",
"retrieve": retrieve_b
}
}

我发现这种方法比试图通过配置来表达代码逻辑更可行。然后你可以很容易地收集名字:

for dct in all_jsons.values():
data = ...  # requests.get(dct["url"]).json()  # or similar
names = dct["retrieve"](data)

若要从带有关键字的字典中获取值(如果该关键字可能不存在(,则使用dict.get(key)。为了区分listdict或其他类型,type(val)适用于。它们的结合应该能解决你的问题。

最新更新