代码之家  ›  专栏  ›  技术社区  ›  sdgd

在python中动态拉json

  •  1
  • sdgd  · 技术社区  · 7 年前

    我刚开始在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
    

    使用regex-

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

    请澄清如何获取3种不同的数据并将其存储到array.tia中。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Jamie Bull    7 年前

    如果您实际需要三个独立的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"]],
    )
    
        2
  •  1
  •   A l w a y s S u n n y    7 年前

    如果我没有误解您的需求,那么这对您的JSON很好,我已经用您的JSON结构创建了一个JSON文件,加载/解析并最终将其设置为 address , status server_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)
    
        3
  •  0
  •   Sunitha    7 年前

    使用列表理解,在 json_data['members'] 从每个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')