【问题标题】:How to extract specific fields recursively from json output?如何从json输出中递归提取特定字段?
【发布时间】:2019-03-09 00:54:41
【问题描述】:

下面是我拥有的示例 json 文档或 json 变量。我正在使用 python 来提取输出部分中提到的必填字段。

有人可以帮忙吗?

json_variable = 
    {  
       "server01":{  
          "address":"server01:5454",
          "options":{ },
          "state":"online"
       },
       "server02":{  
          "address":"server02:5454",
          "options":{ },
          "state":"online"
       },
       "server03":{  
          "address":"server03:5454",
          "options":{ },
          "state":"online"
       }
    }

 for x in json_variable:
        print(x["address"])

    Error:
      Traceback (most recent call last):
      File "<string>", line 30, in <module>
      File "<string>", line 18, in getServerStatus
      TypeError: 'shell.Dict' object is not iterable

我可以通过硬编码以下字段来获得所需的输出,但我想动态地执行它,因为服务器的数量取决于查询的系统和返回的 json。

print(json_variable["server01"]["address"])
print(json_variable["server02"]["address"])
print(json_variable["server03"]["address"])

所需输出

server01:5454 --> online 
server02:5454 --> online
server03:5454 --> online

【问题讨论】:

  • 一般来说,要执行此操作,您至少必须对 patterns 进行硬编码以查找,这样代码就知道您有兴趣检索什么.但是,不确定为什么您似乎认为它需要递归完成。
  • 到目前为止你尝试了什么?
  • for server in json_variable.values(): print(f"{server['address']} --&gt; {server['status']}")
  • @KlausD。我添加了我尝试过的代码。

标签: python json python-2.7


【解决方案1】:

这是从 JSON 获取服务器状态的另一种方法。

json_info = {
     "server01":{
     "address":"server01:5454",
     "options":{ },
     "state":"online"
   },
     "server02":{
     "address":"server02:5454",
     "options":{ },
     "state":"online"
  },
     "server03":{
     "address":"server03:5454",
     "options":{ },
     "state":"online"
  }
}

for server in json_info.values():
  server_status = server['state']
  if 'online' in server_status:
      server_name = server.get('address')
      print ('{} is online'.format(server_name.split(':')[0]))
      # output 
      # server01 is online
      # server02 is online
      # server03 is online
      # 
      # print ('{} --> online'.format(server_name))
      # output 
      # server01:5454 --> online
      # server02:5454 --> online
      # server03:5454 --> online
  else:
      server_name = server.get('address')
      print('{} is offline'.format(server_name.split(':')[0]))

【讨论】:

    【解决方案2】:

    把它当作字典:

    for k, v in sample.items():
          print(v['address'] + "-->" + v['state'])
    

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多