【问题标题】:Python json nestedPython json 嵌套
【发布时间】:2021-02-07 20:13:17
【问题描述】:

我在 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 的内容,我用 jq 和 .hostvars [] 做什么。

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 或 [],则会出现语法错误。

【问题讨论】:

    标签: python json python-jsons


    【解决方案1】:

    序列化 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)
    

    【讨论】:

      【解决方案2】:
      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']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-20
        • 2020-12-20
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多