从深层嵌套的JSON结构中提取值

Let*_*t4U 3 python json

这是我从其他地方获得的结构,即深度嵌套字典的列表:

{
    "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"
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

询问不同的结构是不可能的(传统的apis等).

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

我想到的候选人:

  • 压扁特定字典,构建复合键,如:

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

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

骗局:如何处理清单?

  • 使用一些递归函数来执行连续的键查找,例如"foo_rbody",然后是"query","info"等.

有更好的候选人?

geo*_*org 8

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

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
Run Code Online (Sandbox Code Playgroud)

用法:

value = get_path(data, "xyzzy_rbody.api.items[0].params.bicycle")
Run Code Online (Sandbox Code Playgroud)