簡體   English   中英

訪問json中的嵌套數據

[英]access nested data in json

我要從此處從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")

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方法(或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"])

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM