首页 > 解决方案 > 如何使用 Python 按值搜索嵌套的 JSON

问题描述

在以下 JSON 对象中(如果更容易,我可以重写)我需要搜索 sshPort 的 id="Talend" 和 envs.id="DEV" 和 sshServer="jardev0"

我尝试过使用 Pandas,但它会使嵌套的 JSON 对象变平,所以我必须创建 3 个中间 Pandas 对象并在其中搜索 3 次。

我希望语法更简单,例如 " [x.id=="talend" && x[envs].id=="DEV" && x|envs].sshServer="jardev0"]."sshPort"

[
    {
        "id": "talend",
        "envs":
            [
            {"id":"DEV",
             "lServeurs" :
                 [
                    {"sshServer":"jardev0", "sshPort":"20022","sshUser":"talend"},
                    {"sshServer":"jardev01","sshPort":"20022","sshUser":"talend"}
                 ]
            },
            {"id": "PROD",
             "lServeurs" :
                [
                    {"sshServer": "jardprd01", "sshPort": "20023","sshUser":"talend"}
                ]
            }
            ]
    },
    {
        "id": "eprel",
        "envs":
            [
                {"id": "DEV",
                 "lServeurs" :
                     [
                         {"sshServer": "jardev0",  "sshPort": "20024", "sshUser":"eprel"},
                         {"sshServer": "jardev01", "sshPort": "20025", "sshUser":"eprel"}
                     ]
                 },
                {"id": "PROD",
                 "lServeurs" :
                     [
                         {"sshServer": "jardprd01", "sshPort": "20026","sshUser":"eprel"}
                     ]
                 }
            ]
    }
]

这应该返回“20022”

标签: pythonjsonnested

解决方案


除非您可以进行列表理解,否则 LINQ 样式过滤语法 AFAIK 不可用。

但是你可以有这样的方法

def get_ssh_port(id,env_id,ssh_server):

  import json
  ssh_ports= []
  input_dict = json.loads(input_json)
  output_dict = [x for x in input_dict if x['id'] == id]
  for x in output_dict:
    for i in x['envs']:
      if(i['id'] == env_id):
        for j in i['lServeurs']:
           if(j['sshServer']==ssh_server):
              ssh_ports.append(j['sshPort'])
  return ssh_ports

用法:

input_json = """
[
    {
        "id": "talend",
        "envs":
            [
            {"id":"DEV",
             "lServeurs" :
                 [
                    {"sshServer":"jardev0", "sshPort":"20022","sshUser":"talend"},
                    {"sshServer":"jardev01","sshPort":"20022","sshUser":"talend"}
                 ]
            },
            {"id": "PROD",
             "lServeurs" :
                [
                    {"sshServer": "jardprd01", "sshPort": "20023","sshUser":"talend"}
                ]
            }
            ]
    },
    {
        "id": "eprel",
        "envs":
            [
                {"id": "DEV",
                 "lServeurs" :
                     [
                         {"sshServer": "jardev0",  "sshPort": "20024", "sshUser":"eprel"},
                         {"sshServer": "jardev01", "sshPort": "20025", "sshUser":"eprel"}
                     ]
                 },
                {"id": "PROD",
                 "lServeurs" :
                     [
                         {"sshServer": "jardprd01", "sshPort": "20026","sshUser":"eprel"}
                     ]
                 }
            ]
    }
]
"""

get_ssh_port(id = 'talend',  env_id = 'DEV',  ssh_server = 'jardev0')

推荐阅读