2015-04-30 3 views
-1

После некоторых исследований я смог получить данные через RESTful API от сетевого устройства:Форматирование ответа HTTPLIB (JSON)

if sys.version_info >= (2,7,9): 
    import ssl 
    conn = httplib.HTTPSConnection('192.168.158.136', 443, context=ssl._create_unverified_context()) 
else: 
    conn = httplib.HTTPSConnection('192.168.158.136', 443) 

headers = {"Authorization" : "Basic %s" % base64.b64encode('user:pass'), 
      "Content-Type" : "application/json"} 

url="https://192.168.158.136/wapi/v1.2/network?_return_fields%2b=extattrs" 

conn.request('GET', url, headers=headers) 
response = conn.getresponse() 

print response.read() 
conn.close() 

Это выводит меня JSon отформатированный список объектов мне нужно:

[ 
    { 
     "_ref": "network/ZG5zLm5ldHdvcmskMTAuMC4wLjAvMjQvMA:10.0.0.0/24/default", 
     "extattrs": { 
      "Location": { 
       "value": "NAU" 
      } 
     }, 
     "network": "10.0.0.0/24", 
     "network_view": "default" 
    }, 
    { 
     "_ref": "network/ZG5zLm5ldHdvcmskMTAuMS4xLjAvMjQvMA:10.1.1.0/24/default", 
     "extattrs": { 
      "Location": { 
       "value": "BTN" 
      } 
     }, 
     "network": "10.1.1.0/24", 
     "network_view": "default" 
    }, 
    { 
     "_ref": "network/ZG5zLm5ldHdvcmskMTAuMi4yLjAvMjQvMA:10.2.2.0/24/default", 
     "extattrs": { 
      "Location": { 
       "value": "TRT" 
      } 
     }, 
     "network": "10.2.2.0/24", 
     "network_view": "default" 
    }, 
    { 
     "_ref": "network/ZG5zLm5ldHdvcmskMTkyLjE2OC4wLjAvMTYvMA:192.168.0.0/16/default", 
     "extattrs": { 
      "Location": { 
       "value": "MCW" 
      } 
     }, 
     "network": "192.168.0.0/16", 
     "network_view": "default" 
    } 
] 

Теперь мне нужно «как-то» формат, который в качестве списка, который содержит только «сеть» и содержимое extattrs «Местоположение» (и только для местоположения, будут другие, но мне нужно только место) в формат:

Network Location, т.е.

 
10.0.0.0/24 NAU 
10.1.1.0/24 BTN 
10.2.2.0/24 TRT 
192.168.0.0/16 MCW 

Я изо всех сил в получении это было сделано, то есть переформатирования кода JSON я получаю обратно из запроса.

+1

Используйте модуль JSON, чтобы преобразовать это питон структуру данных. Вы получите список dicts. Пройдите по списку, распечатав значение для ключевой «сети». – Anthon

+0

@ForceBru: Спасибо за редактирование, но «admin: infoblox» уже был фиктивным паролем, ничего реального – f0rd42

+0

@AndreDieball, я его не трогал. Существует [другое изменение] (http://stackoverflow.com/revisions/29968834/2), которое повлияло на этот пароль – ForceBru

ответ

0

Вам просто нужно использовать модуль json для анализа массива JSON в dict.

import json 

# Your code here 

net_loc = [] 
resp_d = json.loads(response.read()) 
for obj in resp_d: 
    net_loc.append(obj["network"] + " " + obj["extattrs"]["Location"]["value"]) 

В списке net_loc содержится то, что вы хотите.

0

Это рискованно размещать здесь map подхода, так что люди, похоже, не нравится map, но я дам попробовать:

if sys.version_info >= (2,7,9): 
    import ssl 
    conn = httplib.HTTPSConnection('192.168.158.136', 443, context=ssl._create_unverified_context()) 
else: 
    conn = httplib.HTTPSConnection('192.168.158.136', 443) 

import json 
headers = {"Authorization" : "Basic %s" % base64.b64encode('user:pass'), 
      "Content-Type" : "application/json"} 

url="https://192.168.158.136/wapi/v1.2/network?_return_fields%2b=extattrs" 

conn.request('GET', url, headers=headers) 
response = conn.getresponse() 

data = json.loads(response.read()) 
conn.close() 

#variant 1. "map" approach 
networks = map(lambda x: "%s %s" % (x["network"], x["extattrs"]["Location"]["value"]), data) 

print("\n".join(networks)) 

#variant 2. "for" approach 
networks = [] 
for item in data: 
    networks.append("%s %s" % (item["network"], item["extattrs"]["Location"])["value"])) 

print("\n".join(networks)) 
Смежные вопросы