访问json中的嵌套数据

时间:2016-06-23 14:09:49

标签: python json azure

我想从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")

2 个答案:

答案 0 :(得分:1)

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)都包含与&#34; IpRange&#34;相关联的dict列表。 key,所以我们需要迭代内部循环中的那些列表,然后从那些内部dict中提取子网字符串。

如果你愿意,你可以在列表理解中做到这一点,但我建议将它分成几行,例如:

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

通常需要迭代dict的(键,值)对。您可以使用.items方法(或Python 2中的.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"])

答案 1 :(得分:0)

AzurePublicIpAddresses是一本字典,所以:

for i in data["AzurePublicIpAddresses"]:

遍历键(在本例中为字符串)。即你试图做&#34; Region&#34; [&#34; Region&#34;],这是字符串切片。尝试更像:

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"])