【问题标题】:Navigate dict based on its structure根据结构导航dict
【发布时间】:2020-12-15 07:51:13
【问题描述】:

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

json_a = {
    "people": [
        {"name": "John"},
        {"name": "Peter"}
    ]
}

json_b = {
    "humans": {
        "names": ["Adam", "Martin"]
    }
}

正如您在上面看到的,来自 json 的字典具有任意结构。我想定义一些东西,作为导航每个 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。实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: python json dictionary


    【解决方案1】:

    为什么不为每个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)
    

    【讨论】:

      【解决方案2】:

      要从带有键的字典中获取值(如果它可能不存在),dict.get(key) 用于。要区分listdict 或其他类型,type(val) 很有用。将它们结合起来应该可以解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        相关资源
        最近更新 更多