当前位置: 首页 > 知识库问答 >
问题:

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

狄富
2023-03-14

我有一个JSON文件,当我试图删除python dict中的项目时,我从返回KeyError:0的API获取该文件。我认为这是我缺乏JSON技能和格式的综合结果。

我的目标是从ip\u地址\u 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个答案

贺自明
2023-03-14

我把你的要求解释为:

  1. 从“警报”列表中删除ip\u地址\u 1设置为192.168.1.1
  2. 创建所有其他ip\u地址\u 1值的列表

json.load(响应)生成此字典:

{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\u地址\u 1192.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'}}

接下来,在删除不需要的DICT后,通过在警报列表上运行另一个列表理解,可以轻松创建其他ip地址的列表,如上所示:

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

请注意,我们使用get()来处理某些字典可能没有ip\u地址\u 1键的可能性。

>>> ip_addresses
[u'192.168.1.3']
巫马令
2023-03-14

这是不正确的:

# 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")
 类似资料:
  • 问题内容: 我要删除重复的项目,重复的项目可以撤消。结果应为: 如何在Python中实现? 问题答案: 如果订单很重要,您可以随时使用OrderedDict

  • 问题内容: 我想从我的redux状态中删除一个元素。我使用无缝不可变及其API对状态进行操作。但是我找不到在嵌套状态时删除元素的任何好方法。 所以我要删除的元素是: 谢谢! 问题答案: 有时我也陷入了类似情况。 因此,根据redux docs ,更新嵌套对象的方式是:- 但是由于数组处于状态,这会使您的工作更加困难。 因此,有两种方法可以执行此操作。 第一种方式(困难的方式) 自己创建一个新对象并

  • 问题内容: 我是诺言和使用NodeJS中的请求和诺言编写网络代码的新手。 我想删除这些嵌套的Promise,而是将它们链接起来,但是我不确定我将如何处理它/这是否是正确的方法。 这是请求代码: 任何见识将不胜感激。 问题答案: 在每个回调中,您都需要 返回 新的Promise: 调用返回的承诺然后将使用“内部”承诺中的值进行解析,以便您可以轻松地链接它们。 通用模式:

  • 问题内容: 尝试删除以下 用户 创建的 node_modules 目录时: 源文件名大于文件系统支持的文件名。尝试移动到路径名较短的位置,或尝试重命名为较短的名称,然后再尝试执行此操作 我也尝试过+ ,但仍然遇到相同的问题。 问题答案: 由于这是Google的最佳搜索结果,因此这对我有用: 安装RimRaf: 在项目文件夹中,使用以下命令删除node_modules文件夹: 如果要递归删除: [

  • 我不熟悉promise和使用NodeJS中的请求和promise编写网络代码。 我想删除这些嵌套的promise,并将它们链接起来,但我不确定该如何做/这是否是正确的方式。 这是请求代码: 如有任何见解,将不胜感激。

  • 问题内容: 我是诺言和使用NodeJS中的请求和诺言编写网络代码的新手。 我想删除这些嵌套的Promise,而是将它们链接起来,但是我不确定我将如何处理它/这是否是正确的方法。 这是请求代码: 任何见识将不胜感激。 问题答案: 在每个回调中,您都需要 返回 新的Promise: 调用返回的承诺然后将使用“内部”承诺中的值进行解析,以便您可以轻松地链接它们。 通用模式: