如何用Python按值搜索嵌套的JSON

2024-10-03 04:37:23 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的JSON对象中(如果更容易的话,我可以重写),我需要搜索sshPort id="Talend" and envs.id="DEV" and 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”


Tags: and对象devidjsonpandasampenvs
2条回答

使用嵌套列表理解(3个嵌套迭代器非常笨拙):

import json

jsn = """[
    {
        "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"}
                     ]
                 }
            ]
    }
]"""

x = json.loads(jsn)


targetPorts = [server['sshPort'] for envsKV in x for env in envsKV['envs'] for server in env['lServeurs'] if envsKV['id']=="talend" and env['id']=="DEV" and server['sshServer']=="jardev0"] 

print(targetPorts[0])

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')

相关问题 更多 >