我正在使用python删除和更新用户提供的数据生成的JSON文件,因此数据库中只应存储少量项目。我想从JSON文件中删除特定对象。
我的JSON文件是:
[
{
"ename": "mark",
"url": "Lennon.com"
},
{
"ename": "egg",
"url": "Lennon.com"
}
]
我想用ename
mark
删除JSON对象。
由于我是python的新手,我试图通过将对象转换为dict来删除它,但它无法正常工作。还有其他办法吗? 我试过这个:
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
答案 0 :(得分: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
循环结束后立即将它们全部删除(你不想在迭代时修改列表。)
答案 1 :(得分:3)
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)
答案 2 :(得分:0)
你有一个列表,里面有两个项目,恰好是字典。要删除第一个,您可以使用list.remove(item)
或list.pop(0)
或del list[0]
。
http://docs.python.org/2/tutorial/datastructures.html#more-on-lists
答案 3 :(得分: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
答案 4 :(得分: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)