从嵌套的json文件中删除python dict项

时间:2015-02-24 21:38:48

标签: python json

我有一个JSON文件,我从API返回KeyError:0,同时我尝试删除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",
 }
}

2 个答案:

答案 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")

答案 1 :(得分:1)

我已将您的要求解释为:

  1. 从"警告"中删除列出ip_address_1集的任何字典 到192.168.1.1
  2. 创建所有其他ip_address_1值的列表。
  3. 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']