我有一个简单的JSON
{
"users":[
{
"last result": "2%",
"login": "user",
"password": "1",
"id": "1"
}
]
}
我想添加新用户,然后按ID删除用户。
例如:
我想补充一点:
{"id":"2", "login": "admin", "password":"22", "last result": "10%"}
在我的行动之后,json应该是这样的:
{
"users":[
{
"last result": "2%",
"login": "1user",
"password": "1",
"id": "2"
},
{
"id":"2",
"login": "admin",
"password":"22",
"last result": "10%"
}
]
}
我试过这个:
...
user = {"id": 2, "login": "admin", "password": "1", "last result": "2%"}
def save_data_to_json(user):
jsonFile = open("auth.json", "r+")
data = json.load(jsonFile)
jsonFile.close()
data["users"] = user
jsonFile = open("auth.json", "a+")
jsonFile.write(json.dumps(data))
jsonFile.close()
但在此之后,我的JSON看起来有点奇怪:
{
"users":[
{
"last result": "2%",
"login": "1user",
"password": "1",
"id": "2"
}
]
}{"users": {"id": 2, "login": "1user", "password": "1", "last result": "2%"}}
答案 0 :(得分:2)
您应该使用auth.json
而不是w
打开a+
。当您使用a+
打开时,这意味着您将输出附加到它而不是覆盖它。
答案 1 :(得分:0)
试试此代码
import json
user = {"id": 2, "login": "admin", "password": "1", "last result": "2%"}
def save_data_to_json(user):
jsonFile = open("/tmp/auth.json", "r+")
data = json.load(jsonFile)
jsonFile.close()
data["users"].append(user)
jsonFile = open("/tmp/auth.json", "w")
jsonFile.write(json.dumps(data))
jsonFile.close()
save_data_to_json(user)
答案 2 :(得分:0)
您的json对象有一个键'users',它是用户对象的集合。但是在您的代码中,您正在执行data['users'] = user
,它只是用新用户替换现有的集合,而不是添加到其中:
>>> s = '''{
... "users":[
... {
... "last result": "2%",
... "login": "user",
... "password": "1",
... "id": "1"
... }
... ]
... }'''
>>> o = json.loads(s)
>>> o['users']
[{u'last result': u'2%', u'login': u'user', u'password': u'1', u'id': u'1'}]
>>> user = {"id": 2, "login": "admin", "password": "1", "last result": "2%"}
>>> o['users'] = user
>>> o['users']
{'last result': '2%', 'login': 'admin', 'password': '1', 'id': 2}
现在请注意对象的更改方式。它现在只是一个用户对象,而不是用户集合。这将对正在读取此文件的任何应用程序产生影响。
相反,你需要这样做:
>>> o['users'].append(user)
>>> o['users']
[{u'last result': u'2%', u'login': u'user', u'password': u'1', u'id': u'1'}, {'last result': '2%', 'login': 'admin', 'password': '1', 'id': 2}]
现在,'users'集合中有两个用户,用于按用户值删除用户:
>>> o['users'] = [u for u in o['users'] if u['login'] != 'admin'] # Get rid of the admin
>>> o['users']
[{u'last result': u'2%', u'login': u'user', u'password': u'1', u'id': u'1'}]
然后你可以将对象转换回json并将其写出来。
将所有这些放在一起,您的代码是:
with open('auth.json', 'r') as f:
data = json.load(f)
data['users'].append(user)
# If you want to delete
data['users'] = [u for u in o['users'] if u['login'] != 'admin'] # Get rid of the admin
# Write it back
with open('auth.json', 'w') as f:
json.dump(data, f)