2013-10-05 132 views
5

我正在使用python删除和更新从用户提供的数据生成的JSON文件,以便只有少数项目应该存储在数据库中。我想从JSON文件中删除一个特定的对象。如何使用python删除json对象?

我的JSON文件是:

[ 
    { 
     "ename": "mark", 
     "url": "Lennon.com" 
    }, 
    { 
     "ename": "egg", 
     "url": "Lennon.com" 
    } 
] 

我想enamemark删除的JSON对象。

由于我是新的python,我试图通过将对象转换为字典来删除它,但它不工作。有没有其他方法可以做到这一点? 我想这一个:

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 
+2

你能告诉我们你试过的代码吗? – RyPeck

+0

@RyPeck是的我编辑我的问题与我试着的代码.. – arglee

+0

当你运行这个,你有问题,因为该文件没有改变? – RyPeck

回答

11

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

#!/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循环结束时立即将其全部删除(不要想要在遍历它时修改列表)。

+0

它不起作用。当我跑它时,它没有从列表中弹出标记 – arglee

+1

嗯,我用你的确切输入运行该脚本,标记被删除。该脚本正在输出到一个名为''updated-file.json''的新文件,因此它不会更新原始文件。也许这就是发生了什么? – mdml

+0

我实际上粘贴了你的代码,但它仍然不起作用。它是生产同一个文件中以前 – arglee

0

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

http://docs.python.org/2/tutorial/datastructures.html#more-on-lists

+0

@lvo thanx但list.remove(0)将从列表中删除第一项。我想从那里删除整个对象。 – arglee

+0

@ user2511142 http://ideone.com/NlCTSp – Ivo

+0

是的,但它不在这里工作,并显示错误,'文件'不支持删除项目 – arglee

0

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

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 
+2

如果字典处于*不同的位置,该怎么办? –

+0

感谢名单@MartijnPieters但我已经尝试过这...这是行不通的.. – arglee

+0

@MartijnPieters公平点。我已经更新了我的答案以进行线性搜索。 – Nikhil

0

你的json文件包含一个对象列表,它是Python中的字典。只需更换一个新的,没有对象在其列表:

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) 
2

到JSON的正确方法是反序列化,修改创建的对象,然后,如果需要的话,它们序列回JSON。 为此,请使用the json module。总之,使用<deserialized object> = json.loads(<some json string>)来阅读json和<json output> = json.dumps(<your object>)来创建json字符串。 在你的例子中这将是:

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) 
+1

它怎么会这么简单?!最佳答案! – Minoru