2015-02-24 96 views
1

我有一個JSON文件,我從一個返回KeyError:0的API中獲取,而我試圖刪除python字典中的項目。我認爲它結合了我缺乏json的技能和格式。從嵌套的json文件中刪除python字典項目

我的目標是從ip_address_1

去除192.168.1.1所有實例我的代碼:

from api import Request 
import requests, json, ordereddict 

# prepare request 
request = Request().service('').where({"query":"192.168.1.0"}).withType("json") 

# call request 
response = request.execute() 

# parse response into python object 
obj = json.loads(response) 

# remove items 
for i in xrange(len(obj)): 
    if obj[i]["ip_address_1"] == "192.168.1.1": 
     obj.pop(i) 

# display 
print json.dumps(obj,indent=1) 

例JSON:

{ 
"response": { 
    "alerts": [ 
    { 
    "action": "New", 
    "ip_address_1": "192.168.1.1", 
    "domain": "example.com", 
    "ip_address_2": "192.68.1.2" 
    }, 
    { 
    "action": "New", 
    "ip_address_1": "192.168.1.3", 
    "domain": "example2.com", 
    "ip_address_2": "192.168.1.1" 
    } 
    ], 
    "total": "2", 
    "query": "192.168.1.0", 
} 
} 
+1

這聽起來像你想'[OBJ中的[ '響應' 警報[ 'ip_address_1']警報] [ '警報' 如果警報[ 'ip_address_1']!= '192.168.1.1']'。這是你的問題的正確解釋嗎? – 2015-02-24 21:42:29

+0

這是最初的邏輯,但是我想把它分成兩部分,減少數據集然後打印一個部分。我會再給第二部分嘗試併發佈一個新問題。 – 2015-02-24 22:17:51

回答

2

這是不正確的:

# remove items 
for i in xrange(len(obj)): 
    if obj[i]["ip_address_1"] == "192.168.1.1": 
     obj.pop(i) 

您正在迭代對象,就好像它是一個列表。

你想做什麼:

for sub_obj in obj["response"]["alerts"]: 
    if sub_obj["ip_address_1"] == "192.168.1.1": 
     sub_obj.pop("ip_address_1") 
+0

我收到以下錯誤。在提醒之前我需要做些什麼嗎? for sub_obj in obj [「alerts」]: KeyError:'alerts' – 2015-02-24 21:53:58

+0

'obj'看起來像什麼?你能打印出來嗎? – RPGillespie 2015-02-24 21:55:38

+0

{u'response':{u'alerts':[{u'action':u'New',u'ip_address_1':u'192.168.1.1',u'domain':u'example.com',u 'ip_address_2':u'192.168.1.2'},{u'action':u'New' – 2015-02-24 21:59:52

0

我理解你的要求是:

  1. 從 「警告」 名單ip_address_1任何字典中設置 到192.168.1.1刪除。
  2. 創建所有其他ip_address_1值的列表。

json.loads(response)產生此詞典:

{u'response': {u'alerts': [{u'action': u'New', 
          u'domain': u'example.com', 
          u'ip_address_1': u'192.168.1.1', 
          u'ip_address_2': u'192.68.1.2'}, 
          {u'action': u'New', 
          u'domain': u'example2.com', 
          u'ip_address_1': u'192.168.1.3', 
          u'ip_address_2': u'192.168.1.1'}], 
       u'query': u'192.168.1.0', 
       u'total': u'2'}} 

「警報」 列表由(假設字典勢必obj)訪問:

>>> obj['response']['alerts'] 
[{u'action': u'New', 
    u'domain': u'example.com', 
    u'ip_address_1': u'192.168.1.1', 
    u'ip_address_2': u'192.68.1.2'}, 
{u'action': u'New', 
    u'domain': u'example2.com', 
    u'ip_address_1': u'192.168.1.3', 
    u'ip_address_2': u'192.168.1.1'}] 

第一部分可以像進行這個:

alerts = obj['response']['alerts'] 
obj['response']['alerts'] = [d for d in alerts if d.get('ip_address_1') != '192.168.1.1'] 

這裏使用列表理解來過濾掉那些與ip_address_1 192.168.1.1相關的字典,然後將結果列表反彈回obj字典。在此之後obj是:

>>> pprint(obj) 
{u'response': {u'alerts': [{u'action': u'New', 
          u'domain': u'example2.com', 
          u'ip_address_1': u'192.168.1.3', 
          u'ip_address_2': u'192.168.1.1'}], 
       u'query': u'192.168.1.0', 
       u'total': u'2'}} 

接下來,創建其他IP地址的列表,很容易與警報列表上的另一個列表理解來看刪除不想要的類型的字典如上圖所示:

ip_addresses = [d['ip_address_1'] for d in obj['response']['alerts'] if d.get('ip_address_1') is not None] 

請注意,我們使用get()來處理某些字典可能沒有ip_address_1密鑰的可能性。

>>> ip_addresses 
[u'192.168.1.3']