从rest api GET创建嵌套的json格式

时间:2017-03-23 16:23:36

标签: python json rest

问题: 从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&amp;.maxResults=2&amp;.firstResult=0&amp;.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....

2 个答案:

答案 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&amp;.maxResults=2&amp;.firstResult=0&amp;.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)