[英]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.