【问题标题】:How to extract multiple json values from a nested json response using python如何使用python从嵌套的json响应中提取多个json值
【发布时间】:2020-05-04 11:07:21
【问题描述】:

我的测试 url 返回以下 json 响应: 一个={ “版本”:“1.3.0”, “服务”: [ { “版本”:“1.0.0”, "serviceGun": "com.xx.version.1", “描述”:“测试服务”, “链接”:[ { "rel": "能力", "href": "/abc/test", “提示”:[ { “方法”:“获取” } ]

    },
{
    "version": "1.0.0",
    "serviceGun": "com.xx.abx.version.1",
    "description": "mode",
    "links": [ 
    {
        "rel": "mediaConfiguration",
        "href": "/abc/rest",
        "hints": [ 
        {
            "method": "get"

        },
        {
            "method": "put"
        } ]

    },
    {
        "rel": "modeConfiguration",
        "href": "/abc/mode",
        "hints": [ 
        {
            "method": "get"

        },
        {
            "method": "put"
        } ]

    },

{
    "version": "1.0.0",
    "serviceGun": "com.xx.abc.version.1",
    "description": "controlPanel",
    "links": [ 
    {
        "rel": "configuration",
        "href": "/abc/controlPanel",
        "hints": [ 
        {
            "method": "get"

        },
        {
            "method": "put"
        } ]

    },
    {
        "rel": "state",
        "href": "/abc/awc",
        "state": "unavailable",
        "stateReason": "inactivated",
        "hints": [ 
        {
            "method": "get"
        } ]
    } ]

},
 ]

}

通过以下函数,我可以从 json 中检索单个值(例如 href、rel 等)。 但我希望该函数返回一个列表,其中包含所有“href”以及每个href的“提示”中的支持方法。例如:[(href1,hints1),(href1,hints1),(href1,hints1)]

预期输出:[('/abc/test',['get','put']),('/abc/rest',['get','put']),...]

def extract_values(obj, key): """从嵌套的 JSON 中拉取指定键的所有值。""" arr = []

def extract(obj, arr, key):
    """Recursively search for values of key in JSON tree."""
    if isinstance(obj, dict):
        for k, v in obj.items():
            if isinstance(v, (dict, list)):
                extract(v, arr, key)
            elif k == key:
                arr.append(v)
    elif isinstance(obj, list):
        for item in obj:
            extract(item, arr, key)
    return arr

results = extract(obj, arr, key)
return results

运行:test_ref = extract_values(a,'href') 打印 test_ref 输出:['/abc/test','/abc/rest',','/abc/mode','/abc/controlPanel','abc/awc']

预期输出:[('/abc/test',['get','put']),('/abc/rest',['get','put']),...]

【问题讨论】:

    标签: json list python-2.7 dictionary


    【解决方案1】:

    我认为您的递归试图解决一个不存在的问题。您的 JSON 具有清晰可见的层次结构。

    1. a['services'] 是服务列表
    2. a['services'][i]['links']ith 服务的链接列表
    3. a['services'][i]['links'][j]['href']ith 服务的jth 链接的URL

    所以我的函数应该是这样的:

    def parse_links_and_methods(json_result):
        for service in json_result['services']:
            for link in service['links']:
                for hint in link['hints']:
                    if 'method' in hint:
                        yield link['href'], hint['method']
    

    这基本上只是一个巨大的列表理解。您可以将其用作:

    print list(parse_links_and_methods(a))
    

    并获取[('/abc/test', 'get'), ('/abc/rest', 'get'), ('/abc/rest', 'put'), ('/abc/mode', 'get'), ('/abc/mode', 'put'), ...]

    编辑我误读了您的预期输出。以你想要的方式使用它

    def parse_links_and_methods(json_result):
        for service in json_result['services']:
            for link in service['links']:
                methods = [hint['method'] for hint in link['hints']
                           if 'method' in hint]
                yield link['href'], methods
    

    【讨论】:

    • 感谢 Karl,您上面建议的两种方法都可以完美运行。从您的解决方案中了解了生成器的新概念
    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 2017-03-29
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多