python - 如何使用 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”
解决方案
除非您可以进行列表理解,否则 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')
推荐阅读
- python - 如何乘以一个元组?
- android - 使用 JSONObject android 写入内存中的 Json 文件
- python - 根据列中的值制作列表
- go - Windows 10 CMD 中的 Println 输出比 GoLand 控制台慢得多
- python - Django:如何在 pre_save 信号中传递外键值?
- dialogflow-es-fulfillment - Webhook 调用失败。错误:500 内部服务器错误
- mysql - Go 和 mysql,不会拉所有列
- reactjs - 如何在自定义控制台反应组件中使用反应编译器
- angular - 如何使用 Angular 7 将数据绑定到列表/表格中的模板驱动表单?
- delphi - 常量“基数数组”产生错误“常量表达式违反子范围界限”