Python json 嵌套
Python json nested
我在 python 脚本中的嵌套 json 有问题,我需要重现以下 jq 查询:
cat inventory.json | jq '.hostvars[] | [.openstack.hostname, .openstack.accessIPv4]'
json 文件的结构如下:
{
"hostvars": {
"096b430e-20f0-4655-bb97-9bb3ab2db73c": {
"openstack": {
"accessIPv4": "192.168.3.6",
"hostname": "vm-1"
}
}
"8fb7b9b7-5ccc-47c8-addf-64563fdd0d4c": {
"openstack": {
"accessIPv4": "192.168.3.7",
"hostname": "vm-2"
}
}
}
}
使用 jq 的查询给出了正确的输出:
# cat test.json | jq '.hostvars[] | [.openstack.hostname, .openstack.accessIPv4]'
[
"vm-1",
"192.168.3.6"
]
[
"vm-2",
"192.168.3.7"
]
现在我想在 python 中重现它以处理变量中的各个值,但我无法解析每个 id 的内容,我用 .hostvars [].[=16 对 jq 做了什么=]
with open('inventory.json', 'r') as inv:
data=inv.read()
obj=json.loads(data)
objh=obj['hostvars'][096b430e-20f0-4655-bb97-9bb3ab2db73c]['openstack']
print(objh)
调用 id 有效,但如果我用 0 或 [] 替换它,我会遇到语法错误。
json_data = {
"hostvars": {
"096b430e-20f0-4655-bb97-9bb3ab2db73c": {
"openstack": {
"accessIPv4": "192.168.3.6",
"hostname": "vm-1"
}
},
"8fb7b9b7-5ccc-47c8-addf-64563fdd0d4c": {
"openstack": {
"accessIPv4": "192.168.3.7",
"hostname": "vm-2"
}
}
}
}
result = [[value['openstack']['hostname'], value['openstack']['accessIPv4']]
for value in json_data['hostvars'].values()]
print(result)
输出
[['vm-1', '192.168.3.6'], ['vm-2', '192.168.3.7']]
序列化JSON数据
我认为当你处理 json python 你应该使用 convert to Serializing:
json 模块公开了两种将 Python 对象序列化为 JSON 格式的方法。
dump()
会将 Python 数据写入类似文件的对象。当我们想要将 Python 数据序列化到外部 JSON 文件时,我们会使用它。
dumps()
会将 Python 数据写入 JSON 格式的字符串。如果我们想在程序的其他地方使用 JSON,或者如果我们只是想将它打印到控制台以检查它是否正确,这将很有用。
dump() 和 dumps() 方法都允许我们指定一个可选的缩进参数。这将更改用于缩进的空格数,这可以使我们的 JSON 更易于阅读。
json_str = json.dumps(data, indent=4)
例如:
import json
data={"user":{
"name":"CodeView",
"age":29
}
}
with open("data_file.json","w")as write_file:
json.dump(data,write_file)
json_str=json.dumps(data)
print(json_str)
我在 python 脚本中的嵌套 json 有问题,我需要重现以下 jq 查询:
cat inventory.json | jq '.hostvars[] | [.openstack.hostname, .openstack.accessIPv4]'
json 文件的结构如下:
{
"hostvars": {
"096b430e-20f0-4655-bb97-9bb3ab2db73c": {
"openstack": {
"accessIPv4": "192.168.3.6",
"hostname": "vm-1"
}
}
"8fb7b9b7-5ccc-47c8-addf-64563fdd0d4c": {
"openstack": {
"accessIPv4": "192.168.3.7",
"hostname": "vm-2"
}
}
}
}
使用 jq 的查询给出了正确的输出:
# cat test.json | jq '.hostvars[] | [.openstack.hostname, .openstack.accessIPv4]'
[
"vm-1",
"192.168.3.6"
]
[
"vm-2",
"192.168.3.7"
]
现在我想在 python 中重现它以处理变量中的各个值,但我无法解析每个 id 的内容,我用 .hostvars [].[=16 对 jq 做了什么=]
with open('inventory.json', 'r') as inv:
data=inv.read()
obj=json.loads(data)
objh=obj['hostvars'][096b430e-20f0-4655-bb97-9bb3ab2db73c]['openstack']
print(objh)
调用 id 有效,但如果我用 0 或 [] 替换它,我会遇到语法错误。
json_data = {
"hostvars": {
"096b430e-20f0-4655-bb97-9bb3ab2db73c": {
"openstack": {
"accessIPv4": "192.168.3.6",
"hostname": "vm-1"
}
},
"8fb7b9b7-5ccc-47c8-addf-64563fdd0d4c": {
"openstack": {
"accessIPv4": "192.168.3.7",
"hostname": "vm-2"
}
}
}
}
result = [[value['openstack']['hostname'], value['openstack']['accessIPv4']]
for value in json_data['hostvars'].values()]
print(result)
输出
[['vm-1', '192.168.3.6'], ['vm-2', '192.168.3.7']]
序列化JSON数据
我认为当你处理 json python 你应该使用 convert to Serializing:
json 模块公开了两种将 Python 对象序列化为 JSON 格式的方法。
dump()
会将 Python 数据写入类似文件的对象。当我们想要将 Python 数据序列化到外部 JSON 文件时,我们会使用它。dumps()
会将 Python 数据写入 JSON 格式的字符串。如果我们想在程序的其他地方使用 JSON,或者如果我们只是想将它打印到控制台以检查它是否正确,这将很有用。dump() 和 dumps() 方法都允许我们指定一个可选的缩进参数。这将更改用于缩进的空格数,这可以使我们的 JSON 更易于阅读。
json_str = json.dumps(data, indent=4)
例如:
import json
data={"user":{
"name":"CodeView",
"age":29
}
}
with open("data_file.json","w")as write_file:
json.dump(data,write_file)
json_str=json.dumps(data)
print(json_str)