在Python中动态提取JSON

2024-04-26 09:42:39 发布

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

我是python中JSON的新手。我有一个命令,它的输出格式如下-

  "members": [
    {
      "address": "axyz.tcp://app@10.10.10.10:2541",
      "roles": [
        "qq-default",
        "Server1"
      ],
      "status": "Up"
    },
    {
      "address": "axyz.tcp://app@10.10.10.10:2542",
      "roles": [
        "qq-default",
        "Server2"
      ],
      "status": "Up"
    },
    {
      "address": "axyz.tcp://app@10.10.10.10:4011",
      "roles": [
        "qq-default",
        "Server3"
      ],
      "status": "Up"
    },
    {
      "address": "axyz.tcp://app@10.10.10.10:19941",
      "roles": [
        "qq-default"
      ],
      "status": "Up"
    }
  ],
  "self-address": "axyz.tcp://app@10.10.10.10:2542",
  "unreachable": []
}

我尝试只提取地址、服务器名称(如Server1、Server2等)和状态(向上/向下),并将其存储在3个不同的数组中。你知道吗

我尝试使用regex,但是当我尝试提取服务器名称时,我最终会出现错误-'NoneType' object has no attribute 'group'可能是因为空格。你知道吗

我的代码-

import json
json_file = source_jsonfile
with open(json_file) as json_file:
    json_data = json.load(json_file
    for e in json_data: 
        for key, value in e.iteritems():
                print key, value

使用正则表达式-

RIDResult = re.search('"qq-default",        (.*)      ],', status)
print (RIDResult.group())

请说明如何获取3种不同的数据并将其存储到阵列.TIA. 你知道吗


Tags: 服务器名称jsonappdefaultaddressstatustcp
3条回答

如果您真的需要三个独立的item元素数组,这将为您提供:

address, role, status = (
    [i["address"] for i in json_data["members"]],
    [i["roles"][1] if len(i["roles"]) > 1 else None for i in json_data["members"]],
    [i["status"] for i in json_data["members"]],
)

如果我没有误解您的需求,那么这将与您的json一起工作,我已经用您的json结构创建了一个json文件,加载/解析并最终将其设置为addressstatusserver_name索引作为数组tia

import json
from pprint import pprint

with open('members.json') as f:
    data = json.load(f)

#pprint(data)
tia = {
    'address':[],
    'server_name':[],
    'status':[]
}

for members in data['members']:
    tia['address'].append(members['address'])
    tia['status'].append(members['status'])
    try:
       a = members['roles'][1]
    except IndexError:
       a = None
    tia['server_name'].append(a)

print(tia)

使用列表理解,迭代json_data['members']中的每个dict,并从这些dict d作为d['roles'][1] if len(d['roles'])>=2 else None访问服务器名称

>>> [(d['address'],d['roles'][1] if len(d['roles'])>=2 else None) for d in json_data['members']]
[('axyz.tcp://app@10.10.10.10:2541', 'Server1'), ('axyz.tcp://app@10.10.10.10:2542', 'Server2'), ('axyz.tcp://app@10.10.10.10:4011', 'Server3'), ('axyz.tcp://app@10.10.10.10:19941', None)]

要从中创建3个不同的列表,请使用zip

>>> addr, server, status = zip(*[(d['address'],d['roles'][1] if len(d['roles'])>=2 else None, d['status']) for d in json_data['members']])
>>> print(addr)
('axyz.tcp://app@10.10.10.10:2541', 'axyz.tcp://app@10.10.10.10:2542', 'axyz.tcp://app@10.10.10.10:4011', 'axyz.tcp://app@10.10.10.10:19941')
>>> print(server)
('Server1', 'Server2', 'Server3', None)
>>> print(status)
('Up', 'Up', 'Up', 'Up')

相关问题 更多 >