2015-02-24 2 views
1

У меня есть файл JSON, который я извлекаю из API, который возвращает KeyError: 0, в то время как я пытаюсь удалить элементы в python dict. Я предполагаю, что это комбинация моего недостатка в умении и формате json.Удалить элемент python dict из вложенного json-файла

Моя цель состоит в том, чтобы удалить все экземпляры 192.168.1.1 из ip_address_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

Это звучит, как вы хотите '[предупреждения [ ''] ip_address_1 для оповещения в OBJ [ 'ответ'] [ ''] оповещения, если предупреждение [ 'ip_address_1']! = '192.168.1.1']'. Это правильная интерпретация вашего вопроса? –

+0

Это была оригинальная логика, однако я хотел бы разбить ее на две части, уменьшив набор данных, а затем распечатав раздел.Я еще раз попробую вторую часть и задаю новый вопрос. –

ответ

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

Я получаю следующее сообщение об ошибке. Нужно ли мне что-то делать с ответом перед предупреждениями? для sub_obj в obj ["alert"]: KeyError: 'alert' –

+0

Как выглядит 'obj'? Вы можете распечатать это? – RPGillespie

+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 ' –

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'}} 

Список "оповещение" получает доступ (при условии, Dict привязанной к 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-адреса легко с другим списком пониманием запуска в списке предупреждений после удаления нежелательной dicts, как показан выше:

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'] 
Смежные вопросы