【问题标题】:Creating nested json format from rest api GET从rest api GET创建嵌套的json格式
【发布时间】:2017-03-23 16:23:36
【问题描述】:

问题: 从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....

【问题讨论】:

  • 您需要提供API GET请求的json返回数据的格式。
  • 我已经用请求的信息更新了问题
  • 您想要的数据结构输出不是 JSON。
  • 我已删除该要求,因为它与此无关。 @SatishGarg
  • 您拥有的 json:clientID: value { stuff} 无效。所以你不能那样做。但是您可以将实际的客户端 ID 作为字典对象的键。

标签: python json rest


【解决方案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))

【讨论】:

    【解决方案2】:

    你可以像这样更新你的客户字典:

    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)
    

    【讨论】:

    • 这就是我最初想做的事情,但是字典被覆盖了。因此,如果我要遍历所有身份,那么为了测试,我只做两个。它只做最后一个,因为它被覆盖了。我显然需要将这部分排除在循环之外,但我仍在学习,所以我还不确定如何做到这一点。这也不符合我正在寻找的数据结构。
    • 首先,客户端字典被声明在循环之外,因此它的数据不会被覆盖。其次,您不需要显式使用 i 并使用 for 循环。
    • 这看起来很棒,应该可以工作。但是我从第 24 行或第 25 行收到语法错误,但语法看起来是正确的。
    • 回溯到底是什么?
    • # python primeapi2.py File "primeapi2.py", line 25 }) ^ SyntaxError: invalid syntax
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2020-11-10
    • 2020-03-19
    相关资源
    最近更新 更多