【问题标题】:Extracting values from deeply nested JSON structures从深度嵌套的 JSON 结构中提取值
【发布时间】:2013-08-07 05:09:57
【问题描述】:

这是我从别处得到的结构,即深度嵌套的字典列表:

{
    "foo_code": 404,
    "foo_rbody": {
        "query": {
            "info": {
                "acme_no": "444444",
                "road_runner": "123"
            },
            "error": "no_lunch",
            "message": "runner problem."
        }
    },
    "acme_no": "444444",
    "road_runner": "123",
    "xyzzy_code": 200,
    "xyzzy_rbody": {
        "api": {
            "items": [
                {
                    "desc": "OK",
                    "id": 198,
                    "acme_no": "789",
                    "road_runner": "123",
                    "params": {
                        "bicycle": "2wheel",
                        "willie": "hungry",
                        "height": "1",
                        "coyote_id": "1511111"
                    },
                    "activity": "TRAP",
                    "state": "active",
                    "status": 200,
                    "type": "chase"
                }
            ]
        }
    }
}

{
    "foo_code": 200,
    "foo_rbody": {
        "query": {
            "result": {
                "acme_no": "260060730303258",
                "road_runner": "123",
                "abyss": "26843545600"
            }
        }
    },
    "acme_no": "260060730303258",
    "road_runner": "123",
    "xyzzy_code": 200,
    "xyzzy_rbody": {
        "api": {
            "items": [
                {
                    "desc": "OK",
                    "id": 198,
                    "acme_no": "789",
                    "road_runner": "123",
                    "params": {
                        "bicycle": "2wheel",
                        "willie": "hungry",
                        "height": "1",
                        "coyote_id": "1511111"
                    },
                    "activity": "TRAP",
                    "state": "active",
                    "status": 200,
                    "type": "chase"
                }
            ]
        }
    }
}

要求不同的结构是不可能的(旧版 api 等)。

所以我想知道是否有一些聪明的方法可以从这样的结构中提取选定的值。

我正在考虑的候选人:

  • 展平特定的字典,构建复合键,诸如此类:

    { “foo_rbody.query.info.acme_no”:“444444”, “foo_rbody.query.info.road_runner”:“123”, ... }

Pro:通过一次访问获取每个值,如果没有可预测的键,则意味着该结构不存在(您可能已经注意到,字典可能具有不同的结构,具体取决于它是否成功操作,是否发生错误,等)。

缺点:如何处理列表?

  • 使用一些递归函数来执行连续的键查找,比如“foo_rbody”,然后是“query”、“info”等。

有更好的候选人吗?

【问题讨论】:

    标签: python json


    【解决方案1】:

    您可以尝试这个相当简单的函数来访问嵌套属性:

    import re
    
    def get_path(dct, path):
        for i, p in re.findall(r'(\d+)|(\w+)', path):
            dct = dct[p or int(i)]
        return dct
    

    用法:

    value = get_path(data, "xyzzy_rbody.api.items[0].params.bicycle")
    

    【讨论】:

    • 简单、非递归、紧凑。为什么我没有那样想?哦,好吧。
    【解决方案2】:

    也许我对this post 的回答中的函数byPath 可能会对您有所帮助。

    【讨论】:

      【解决方案3】:

      您可以创建自己的路径机制,然后使用路径查询复杂的字典。示例:

      • / : 获取根对象
      • /key:获取root_object['key']的值,例如/foo_code --> 404
      • /key/key:嵌套:/foo_rbody/query/info/acme_no -> 444444
      • /key[i]:获取该列表的 ith 元素,例如/xyzzy_rbody/api/items[0]/desc --> "OK"

      该路径还可以返回一个字典,然后您可以在该字典上运行更多查询等。

      递归实现相当容易。

      【讨论】:

        【解决方案4】:

        我想了另外两个解决方案:

        您可以尝试包Pynq,在此处描述 - structured query language for JSON (in Python)。据我了解,它是某种用于 python 的 LINQ。

        您也可以尝试将您的 JSON 转换为 XML,然后使用 Xquery 语言从中获取数据 - XQuery library under Python

        【讨论】:

        • pynq 很酷,谢谢!我不确定我是否会使用它(这里似乎有点矫枉过正),但拥有这样的工具真是太好了。
        猜你喜欢
        • 1970-01-01
        • 2021-07-18
        • 2017-04-03
        • 1970-01-01
        • 2020-11-07
        • 2020-03-19
        • 2021-08-09
        • 2019-03-15
        • 2017-07-30
        相关资源
        最近更新 更多