问题: 从rest api GET
中存储的值创建json数据结构问题: 动态创建嵌套数据结构
用于检索值的Python代码:
url = 'https://ciscoprime.com/webacs/api/v2/data/ClientDetails.json?.nocount=True&.maxResults=2&.firstResult=0&.full=true'
get_response = requests.get(url, verify=False)
response = json.dumps(get_response.json())
resp = json.loads(response)
#variable = resp['queryResponse']['entity'][i]['clientDetailsDTO']['']
i = 0
clients = {}
while i < len(resp['queryResponse']['entity']):
clientID = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("@id")
associationTime = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("associationTime")
clientInterface = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("clientInterface")
connectionType = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("connectionType")
deviceIpAddress = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("deviceIpAddress")
deviceName = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("deviceName")
firstSeenTime = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("firstSeenTime")
ifIndex = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("ifIndex")
ipAddress = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("ipAddress")
macAddress = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("macAddress")
updateTime = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("updateTime")
vendor = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("vendor")
vlan = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("vlan")
vlanName = resp.get("queryResponse", {}).get("entity", {})[i].get("clientDetailsDTO", {}).get("vlanName")
#print 'ClientID: {0}, associationTime: {1}, vlanName: {2}'.format(clientID, associationTime, vlanName)
i += 1
GET格式在json中
{"queryResponse": {"@responseType": "listEntityInstances",
"@count": 192077, "@last": 1, "@rootUrl": "https://ciscopri
me.com/webacs/api/v2/data", "@requestUrl": "https://c
iscoprime.com/webacs/api/v2/data/ClientDetails?.nocou
nt=True&.maxResults=2&.firstResult=0&.full=true
", "entity": [{"clientDetailsDTO": {"apName": "nzcfd-rotoof
f-ap2", "deviceName": "cntl-1", "updateTime":
1490290426910, "protocol": "DOT11N2_4GNZ", "clientInterfac
e": "management", "macAddress": "FF:FF:FF:FF:FF:FF", "ccxLS
Version": "V1", "policyTypeStatus": "NOMETHOD", "wgbMacAddr
ess": "00:00:00:00:00:00", "wepState": "DISABLED", "ccxVers
ion": "UNSUPPORTED", "speed": "UNKNOWN", "@displayName": "4
110106", "hreapLocallyAuthenticated": "2", "ssid": "Gue
st", "clientAaaOverrideAclApplied": "NA", "ccxVSVersion": "
V1", "securityPolicyStatus": "FAILED", "authenticationAlgor
ithm": "OPENSYSTEM", "connectionType": "LIGHTWEIGHTWIRELESS
", "postureStatus": "UNKNOWN", "deviceType": "none", "locat
ion": "Root Area", "wiredClientType": "NA", "status": "ASSO
CIATED", "firstSeenTime": 1487771895967, "wgbStatus": "REGU
LARCLIENT", "vendor": "Samsung Electronics", "vlan": "10",
"ccxMSVersion": "V1", "nacState": "ACCESS", "webSecurity":
"DISABLED", "policyType": "NA", "associationTime": 14881782
85705, "ifIndex": 0, "apIpAddress": {"address": "1.2.2.2"}, "@id": 4110106, "eapType": "UNNOWN", "mobilityStatus"
: "EXPORTANCHORED", "ipType": "IPV4", "ipAddress": {"addres
s": "10.2.2.2"}, "apSlotId": 0, "encryptionCypher": "
NONE", "apMacAddress": "FF:FF:FF:FF:FF:FF", "ccxFSVersion":
"V1", "clientApMode": "UNKNOWN", "deviceIpAddress": {"addr
ess": "172.2.2.2"}, "clientAclApplied": "NA"}, "@url": "
https://ciscoprime.com/webacs/api/v2/data/ClientDetai
ls/4110106", "@type": "ClientDetails", "@dtoType": "clientD
etailsDTO"}
所需的数据结构输出。
clientID : value
{
associationTime : value
clientInterface : value
etc...
}
clientID : value
{
associationTime : value
clientInterface : value
etc...
}
etc....
答案 0 :(得分:1)
以下代码可以满足您的需求。它找到id字段,然后遍历所有键并将它们添加到dict中,将id:{values}添加到主dict,我们将在末尾打印。
导入json
my_response = {"queryResponse": {"@responseType": "listEntityInstances", "@count": 192077, "@last": 1,
"@rootUrl": "https://ciscoprime.com/webacs/api/v2/data",
"@requestUrl": "https://ciscoprime.com/webacs/api/v2/data/ClientDetails?.nocount=True&.maxResults=2&.firstResult=0&.full=true",
"entity": [{"clientDetailsDTO": {"apName": "nzcfd-rotooff-ap2", "deviceName": "cntl-1",
"updateTime": 1490290426910,
"protocol": "DOT11N2_4GNZ",
"clientInterface": "management",
"macAddress": "FF:FF:FF:FF:FF:FF",
"ccxLSVersion": "V1", "policyTypeStatus": "NOMETHOD",
"wgbMacAddress": "00:00:00:00:00:00",
"wepState": "DISABLED", "ccxVersion": "UNSUPPORTED",
"speed": "UNKNOWN", "@displayName": "4110106",
"hreapLocallyAuthenticated": "2", "ssid": "Guest",
"clientAaaOverrideAclApplied": "NA",
"ccxVSVersion": "V1",
"securityPolicyStatus": "FAILED",
"authenticationAlgorithm": "OPENSYSTEM",
"connectionType": "LIGHTWEIGHTWIRELESS",
"postureStatus": "UNKNOWN", "deviceType": "none",
"location": "Root Area", "wiredClientType": "NA",
"status": "ASSOCIATED",
"firstSeenTime": 1487771895967,
"wgbStatus": "REGULARCLIENT",
"vendor": "Samsung Electronics", "vlan": "10",
"ccxMSVersion": "V1", "nacState": "ACCESS",
"webSecurity": "DISABLED", "policyType": "NA",
"associationTime": 1488178285705, "ifIndex": 0,
"apIpAddress": {"address": "1.2.2.2"}, "@id": 4110106,
"eapType": "UNNOWN",
"mobilityStatus": "EXPORTANCHORED", "ipType": "IPV4",
"ipAddress": {"address": "10.2.2.2"}, "apSlotId": 0,
"encryptionCypher": "NONE",
"apMacAddress": "FF:FF:FF:FF:FF:FF",
"ccxFSVersion": "V1", "clientApMode": "UNKNOWN",
"deviceIpAddress": {"address": "172.2.2.2"},
"clientAclApplied": "NA"},
"@url": "https://ciscoprime.com/webacs/api/v2/data/ClientDetails/4110106",
"@type": "ClientDetails", "@dtoType": "clientDetailsDTO"},
{"clientDetailsDTO": {"apName": "nzcfd-rotooff-ap2", "deviceName": "cntl-1",
"updateTime": 1490290426910,
"protocol": "DOT11N2_4GNZ",
"clientInterface": "management",
"macAddress": "FF:FF:FF:FF:FF:FF",
"ccxLSVersion": "V1", "policyTypeStatus": "NOMETHOD",
"wgbMacAddress": "00:00:00:00:00:00",
"wepState": "DISABLED", "ccxVersion": "UNSUPPORTED",
"speed": "UNKNOWN", "@displayName": "4110106",
"hreapLocallyAuthenticated": "2", "ssid": "Guest",
"clientAaaOverrideAclApplied": "NA",
"ccxVSVersion": "V1",
"securityPolicyStatus": "FAILED",
"authenticationAlgorithm": "OPENSYSTEM",
"connectionType": "LIGHTWEIGHTWIRELESS",
"postureStatus": "UNKNOWN", "deviceType": "none",
"location": "Root Area", "wiredClientType": "NA",
"status": "ASSOCIATED",
"firstSeenTime": 1487771895967,
"wgbStatus": "REGULARCLIENT",
"vendor": "Samsung Electronics", "vlan": "10",
"ccxMSVersion": "V1", "nacState": "ACCESS",
"webSecurity": "DISABLED", "policyType": "NA",
"associationTime": 1488178285705, "ifIndex": 0,
"apIpAddress": {"address": "1.2.2.2"}, "@id": 4110107,
"eapType": "UNNOWN",
"mobilityStatus": "EXPORTANCHORED", "ipType": "IPV4",
"ipAddress": {"address": "10.2.2.2"}, "apSlotId": 0,
"encryptionCypher": "NONE",
"apMacAddress": "FF:FF:FF:FF:FF:FF",
"ccxFSVersion": "V1", "clientApMode": "UNKNOWN",
"deviceIpAddress": {"address": "172.2.2.2"},
"clientAclApplied": "NA"},
"@url": "https://ciscoprime.com/webacs/api/v2/data/ClientDetails/4110106",
"@type": "ClientDetails", "@dtoType": "clientDetailsDTO"}]}}
clientlist = my_response['queryResponse'].get('entity', [])
# Initialize my empty dict
formatted_clients = {}
if clientlist:
for client in clientlist:
# Initialize an empty client dict.
client_dict = {}
# Validate clientDetailsDTO
if "clientDetailsDTO" in client:
client_id = client['clientDetailsDTO'].get('@id', '')
if not client_id:
# Let's bail out if this doesn't exist
continue
for key in client['clientDetailsDTO'].keys():
# iterate through the keys, and add them to the client dict
if key == "@id":
# we don't need the client id key inside the dict
continue
client_dict[key] = client['clientDetailsDTO'][key]
# append the client_dict to formatted list
formatted_clients[client_id] = client_dict
print(json.dumps(formatted_clients, indent=4))
结果:
{
"4110106": {
"firstSeenTime": 1487771895967,
"status": "ASSOCIATED",
"@displayName": "4110106",
"clientAaaOverrideAclApplied": "NA",
"mobilityStatus": "EXPORTANCHORED",
"ccxFSVersion": "V1",
"deviceType": "none",
"ccxMSVersion": "V1",
"speed": "UNKNOWN",
"location": "Root Area",
"ipType": "IPV4",
"wepState": "DISABLED",
"eapType": "UNNOWN",
"wiredClientType": "NA",
"hreapLocallyAuthenticated": "2",
"apMacAddress": "FF:FF:FF:FF:FF:FF",
"ccxVersion": "UNSUPPORTED",
"webSecurity": "DISABLED",
"wgbMacAddress": "00:00:00:00:00:00",
"encryptionCypher": "NONE",
"nacState": "ACCESS",
"macAddress": "FF:FF:FF:FF:FF:FF",
"securityPolicyStatus": "FAILED",
"ssid": "Guest",
"deviceIpAddress": {
"address": "172.2.2.2"
},
"clientAclApplied": "NA",
"ccxVSVersion": "V1",
"ifIndex": 0,
"clientApMode": "UNKNOWN",
"apIpAddress": {
"address": "1.2.2.2"
},
"connectionType": "LIGHTWEIGHTWIRELESS",
"vlan": "10",
"ccxLSVersion": "V1",
"apSlotId": 0,
"clientInterface": "management",
"protocol": "DOT11N2_4GNZ",
"authenticationAlgorithm": "OPENSYSTEM",
"vendor": "Samsung Electronics",
"updateTime": 1490290426910,
"deviceName": "cntl-1",
"apName": "nzcfd-rotooff-ap2",
"ipAddress": {
"address": "10.2.2.2"
},
"wgbStatus": "REGULARCLIENT",
"postureStatus": "UNKNOWN",
"policyTypeStatus": "NOMETHOD",
"associationTime": 1488178285705,
"policyType": "NA"
},
"4110107": {
"firstSeenTime": 1487771895967,
"status": "ASSOCIATED",
"@displayName": "4110106",
"clientAaaOverrideAclApplied": "NA",
"mobilityStatus": "EXPORTANCHORED",
"ccxFSVersion": "V1",
"deviceType": "none",
"ccxMSVersion": "V1",
"speed": "UNKNOWN",
"location": "Root Area",
"ipType": "IPV4",
"wepState": "DISABLED",
"eapType": "UNNOWN",
"wiredClientType": "NA",
"hreapLocallyAuthenticated": "2",
"apMacAddress": "FF:FF:FF:FF:FF:FF",
"ccxVersion": "UNSUPPORTED",
"webSecurity": "DISABLED",
"wgbMacAddress": "00:00:00:00:00:00",
"encryptionCypher": "NONE",
"nacState": "ACCESS",
"macAddress": "FF:FF:FF:FF:FF:FF",
"securityPolicyStatus": "FAILED",
"ssid": "Guest",
"deviceIpAddress": {
"address": "172.2.2.2"
},
"clientAclApplied": "NA",
"ccxVSVersion": "V1",
"ifIndex": 0,
"clientApMode": "UNKNOWN",
"apIpAddress": {
"address": "1.2.2.2"
},
"connectionType": "LIGHTWEIGHTWIRELESS",
"vlan": "10",
"ccxLSVersion": "V1",
"apSlotId": 0,
"clientInterface": "management",
"protocol": "DOT11N2_4GNZ",
"authenticationAlgorithm": "OPENSYSTEM",
"vendor": "Samsung Electronics",
"updateTime": 1490290426910,
"deviceName": "cntl-1",
"apName": "nzcfd-rotooff-ap2",
"ipAddress": {
"address": "10.2.2.2"
},
"wgbStatus": "REGULARCLIENT",
"postureStatus": "UNKNOWN",
"policyTypeStatus": "NOMETHOD",
"associationTime": 1488178285705,
"policyType": "NA"
}
}
在您确切的上下文中,此代码将与您想要的字段一起使用:
import json
import requests
url = 'https://ciscoprime.com/webacs/api/v2/data/ClientDetails.json?.nocount=True&.maxResults=2&.firstResult=0&.full=true'
get_response = requests.get(url, verify=False)
response = json.dumps(get_response.json())
resp = json.loads(response)
clientlist = resp['queryResponse'].get('entity', [])
# Initialize my empty dict
formatted_clients = {}
search_keys = ["associationTime", "clientInterface", "connectionType", "deviceIpAddress", "deviceName", "firstSeenTime", "macAddress", "updateTime", "vendor", "vlan", "vlanName"]
if clientlist:
for client in clientlist:
# Initialize an empty client dict.
client_dict = {}
# Validate clientDetailsDTO
if "clientDetailsDTO" in client:
client_id = client['clientDetailsDTO'].get('@id', '')
if not client_id:
# Let's bail out if this doesn't exist
continue
for key in client['clientDetailsDTO'].keys():
# iterate through the keys, and add them to the client dict
if key in search_keys:
client_dict[key] = client['clientDetailsDTO'][key]
# append the client_dict to formatted list
formatted_clients[client_id] = client_dict
print(json.dumps(formatted_clients, indent=4))
答案 1 :(得分:0)
您可以更新您的客户字典:
clients = []
for data in resp['queryResponse']['entity'] :
clientID = data.get("clientDetailsDTO", {}).get("@id")
associationTime = data.get("clientDetailsDTO", {}).get("associationTime")
clientInterface = data.get("clientDetailsDTO", {}).get("clientInterface")
connectionType = data.get("clientDetailsDTO", {}).get("connectionType")
deviceIpAddress = data.get("clientDetailsDTO", {}).get("deviceIpAddress")
deviceName = data.get("clientDetailsDTO", {}).get("deviceName")
firstSeenTime = data.get("clientDetailsDTO", {}).get("firstSeenTime")
ifIndex = data.get("clientDetailsDTO", {}).get("ifIndex")
ipAddress = data.get("clientDetailsDTO", {}).get("ipAddress")
macAddress = data.get("clientDetailsDTO", {}).get("macAddress")
updateTime = data.get("clientDetailsDTO", {}).get("updateTime")
vendor = data.get("clientDetailsDTO", {}).get("vendor")
vlan = data.get("clientDetailsDTO", {}).get("vlan")
vlanName = data.get("clientDetailsDTO", {}).get("vlanName")
clients.append({
'ClientID' : clientID,
'value' :
{
'associationTime' : associationTime,
'vlanName' : vlanName,
'connectionType' : connectionType
}
})
json.dumps(clients)