如何使用python删除json对象?

how to delete json object using python?

我正在使用python删除和更新一个由用户提供的数据生成的JSON文件,这样数据库中只存储很少的项目。我想从JSON文件中删除一个特定的对象。

我的JSON文件是:

1
2
3
4
5
6
7
8
9
10
[
  {
     "ename":"mark",
     "url":"Lennon.com"
  },
  {
     "ename":"egg",
     "url":"Lennon.com"
  }
]

我想删除带有enamemark的json对象。

由于我对python不熟悉,我试图通过将对象转换为dict来删除它,但它不起作用。还有别的办法吗?我试过这个:

1
2
3
4
5
6
7
8
index=0
while index < len(data):
    next=index+1
    if(data[index]['ename']==data[next]['ename']):
        print"match found at"
        print"line %d and %d" %(next,next+1)
        del data[next]
    index +=1


下面是一个完整的示例,它加载JSON文件,删除目标对象,然后将更新后的JSON对象输出到文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python                                                              

# Load the JSON module and use it to load your JSON file.                      
# I'm assuming that the JSON file contains a list of objects.                  
import json
obj  = json.load(open("file.json"))

# Iterate through the objects in the JSON and pop (remove)                      
# the obj once we find it.                                                      
for i in xrange(len(obj)):
    if obj[i]["ename"] =="mark":
        obj.pop(i)
        break

# Output the updated file with pretty JSON                                      
open("updated-file.json","w").write(
    json.dumps(obj, sort_keys=True, indent=4, separators=(',', ': '))
)

主要的一点是,我们通过迭代加载列表中的对象找到对象,然后在找到对象后将其从列表中弹出。如果需要在列表中删除多个对象,那么应该存储要删除的对象的索引,然后在到达for循环的末尾之后立即删除所有这些对象(在迭代列表时不想修改列表)。


JSON的正确方法是反序列化它,修改创建的对象,然后,如果需要,将它们序列化回JSON。为此,请使用JSON模块。简而言之,使用 = json.loads()读取json,使用 = json.dumps()创建json字符串。在您的示例中,这将是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import json
o = json.loads("""[
    {
       "ename":"mark",
       "url":"Lennon.com"
    },
    {
       "ename":"egg",
       "url":"Lennon.com"
    }
]"""
)
# kick out the unwanted item from the list
o = filter(lambda x: x['ename']!="mark", o)
output_string = json.dumps(o)


JSON文件包含在对象列表中,这些对象是Python中的字典。只需将列表替换为不包含对象的新列表:

1
2
3
4
5
6
7
8
import json

with open('testdata.json', 'rb') as fp:
    jsondata = json.load(fp)

jsondata = [obj for obj in jsondata if obj['ename'] == 'mark']

print json.dumps(jsondata, indent=4)

您需要使用json模块。我假设是Python。试试这个:

1
2
3
4
5
6
7
import json
json_data = json.loads('<json_string>')

for i in xrange(len(json_data)):
  if(json_data[i]["id"] =="mark"):
    del json_data[i]
    break


你有一个列表,上面有两个项目,恰好是字典。要删除第一个,可以使用list.remove(item)list.pop(0)del list[0]

http://docs.python.org/2/tutorial/datastructures.html更多列表