访问json中的嵌套数据

2024-05-29 03:35:13 发布

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

我想从here检索Azure云的所有IP地址范围 json转换后的数据格式如下:

{
  "AzurePublicIpAddresses": {
    "Region": [
      {
        ...
        "IpRange": [
          {
            "_Subnet": "40.69.96.0/19"
          },
          {
            "_Subnet": "40.86.192.0/18"
          }
        ],
        "_Name": "canadaeast"
      },
      {
        "IpRange": [
          {
            "_Subnet": "13.71.160.0/19"
          },
          {
            "_Subnet": "13.88.224.0/19"
          },
          {
            "_Subnet": "40.85.192.0/18"
          }
        ],
        "_Name": "canadacentral"
      }
    ],
    "_xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
    "_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance"
  }
}

我无法访问IP范围?通过这个密码?你知道吗

with open('AZURE_IP.json') as data_file:
    data = json.load(data_file)

list_IPCIDR = []
for i in data["AzurePublicIpAddresses"]:
    for ii in i["Region"]:
        for j in ii["IpRange"]:
            list_IPCIDR.append(i["_Subnet"])

sys.stdout=open("test2.txt","w")

Tags: nameinorgjsonhttpfordatawww
2条回答

AzurePublicIpAddresses是一个字典,所以:

for i in data["AzurePublicIpAddresses"]:

遍历键(在本例中是字符串)。也就是说,你正在尝试做“Region”[“Region”],这是字符串切片。请尝试以下操作:

for i in data["AzurePublicIpAddresses"]:
    for ii in data["Azure..."][i]:
        # Use ii as it is the contents of the 'Region' attribute
        if type(ii) == list: # Sometimes ii is a string, like at the end of your data.
            list_IPCIDR.append(ii["IpRange"]["_Subnet"])

data["AzurePublicIpAddresses"]dict。直接在dict上迭代只会得到该dict的键。你知道吗

所以呢

for i in data["AzurePublicIpAddresses"]:
    print(i)

将打印

Region
_xmlns:xsd
_xmlns:xsi

以某种顺序。你知道吗

您可以获得如下子网IP范围:

list_IPCIDR = []
for ipr in data["AzurePublicIpAddresses"]["Region"]:
    for d in ipr["IpRange"]:
        list_IPCIDR.append(d["_Subnet"])

print(list_IPCIDR)

输出

['40.69.96.0/19', '40.86.192.0/18', '13.71.160.0/19', '13.88.224.0/19', '40.85.192.0/18']

这是因为data["AzurePublicIpAddresses"]["Region"]是一个dict列表。每个dict(临时绑定到名称ipr)都包含一个与“IpRange”键关联的dict列表,因此我们需要在内部循环中迭代这些列表,然后从这些内部dict中提取子网字符串

如果你喜欢,你可以用列表的方式来理解,但是我建议你把它分成几行,例如:

list_IPCIDR = [d["_Subnet"] 
    for ipr in data["AzurePublicIpAddresses"]["Region"] 
        for d in ipr["IpRange"]]

通常需要迭代dict的(键、值)对。您可以使用.items方法(或python2中的.iteritems)来实现这一点。例如

list_IPCIDR = []
for key, val in data["AzurePublicIpAddresses"].items():
    if key == "Region":
        for dct in val:
            for s in dct["IpRange"]:
                list_IPCIDR.append(s["_Subnet"])

相关问题 更多 >

    热门问题