【问题标题】:How to transform part of an api response to full json in python如何在python中将部分api响应转换为完整的json
【发布时间】:2020-12-03 19:07:59
【问题描述】:

我已设法将我的数据从系统中取回,但其中一个字段以一长串管道分隔数据的形式返回,而不是 json 格式。

这是我的 python 脚本中的 api 调用和响应处理:

        info = requests.request("GET", url, headers=headers, verify=False)
        data = info.json()

        return(data)

这是响应数据的净化版本。我关心的字段是“属性”字段中的数据。如何将其转换为嵌套的 json 数组?

[
    {
        "id": 00000001,
        "name": "hostname1",
        "type": "HostRecord",
        "properties": "absoluteName=hostname1.mydomain.com|parentId=00000010|parentType=Zone|reverseRecord=false|addresses=10.10.10.11|addressIds=00000100|"
    },
    {
        "id": 00000002,
        "name": "hostname2",
        "type": "HostRecord",
        "properties": "absoluteName=hostname2.mydomain.com|parentId=00000020|parentType=Zone|reverseRecord=true|addresses=10.10.10.12|addressIds=00000200|"
    }

【问题讨论】:

    标签: python json python-3.x string api


    【解决方案1】:

    类似下面的

    data = [
        {
            "id": "00000001",
            "name": "hostname1",
            "type": "HostRecord",
            "properties": "absoluteName=hostname1.mydomain.com|parentId=00000010|parentType=Zone|reverseRecord=false|addresses=10.10.10.11|addressIds=00000100|"
        },
        {
            "id": "00000002",
            "name": "hostname2",
            "type": "HostRecord",
            "properties": "absoluteName=hostname2.mydomain.com|parentId=00000020|parentType=Zone|reverseRecord=true|addresses=10.10.10.12|addressIds=00000200|"
        }
    ]
    
    
    def make_dict(properties: str) -> dict:
        result = {}
        pairs = properties.split('|')
        for pair in pairs:
            if pair:
                k, v = pair.split('=')
                result[k] = v
        return result
    
    
    for entry in data:
        entry['properties'] = make_dict(entry['properties'])
    print(data)
    

    输出

    [{'id': '00000001', 'name': 'hostname1', 'type': 'HostRecord', 'properties': {'absoluteName': 'hostname1.mydomain.com', 'parentId': '00000010', 'parentType': 'Zone', 'reverseRecord': 'false', 'addresses': '10.10.10.11', 'addressIds': '00000100'}}, {'id': '00000002', 'name': 'hostname2', 'type': 'HostRecord', 'properties': {'absoluteName': 'hostname2.mydomain.com', 'parentId': '00000020', 'parentType': 'Zone', 'reverseRecord': 'true', 'addresses': '10.10.10.12', 'addressIds': '00000200'}}]
    

    【讨论】:

      【解决方案2】:

      试试这个:

      a = [
      {
          "id": 1,
          "name": "hostname1",
          "type": "HostRecord",
          "properties":"absoluteName=hostname1.mydomain.com|parentId=00000010|parentType=Zone|reverseRecord=false|addresses=10.10.10.11|addressIds=00000100|",
      },
      {
          "id": 2,
          "name": "hostname2",
          "type": "HostRecord",
          "properties": "absoluteName=hostname2.mydomain.com|parentId=00000020|parentType=Zone|reverseRecord=true|addresses=10.10.10.12|addressIds=00000200|",
      },
      ]
      
      for list_item in a:
          temp_dict = {}
          for item in list_item["properties"].split("|"):
              if item != "":
                  key1, value1 = item.split("=")
                  temp_dict[key1] = value1
          list_item["properties"] = temp_dict
      
      print(a)
      

      输出:

      [{'id': 1, 'name': 'hostname1', 'type': 'HostRecord', 'properties': {'absoluteName': 'hostname1.mydomain.com', 'parentId': '00000010', 'parentType': 'Zone', 'reverseRecord': 'false', 'addresses': '10.10.10.11', 'addressIds': '00000100'}}, {'id': 2, 'name': 'hostname2', 'type': 'HostRecord', 
      'properties': {'absoluteName': 'hostname2.mydomain.com', 'parentId': '00000020', 'parentType': 'Zone', 'reverseRecord': 'true', 'addresses': '10.10.10.12', 'addressIds': '00000200'}}]
      

      【讨论】:

        【解决方案3】:

        如果我理解正确,您希望 "absoluteName=hostname1.mydomain.com|parentId=00000010" 变成数组 ["absoluteName=hostname1.mydomain.com", "parentId=00000010"]。如果是这种情况,您的解决方案非常简单:

        for dct in data:
            dct['properties'] = dct['properties'].split('|')
        

        这只是在'|' 处拆分字符串,返回结果列表并将其再次设置为等于properties 字段。

        但是,我不确定这正是您要寻找的。这就是您所说的“嵌套json数组”吗?

        【讨论】:

          猜你喜欢
          • 2015-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-01
          • 2018-07-15
          相关资源
          最近更新 更多