使用Python将数据编辑为JSON

时间:2014-08-05 10:33:54

标签: python json

我有一个简单的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%"}}

3 个答案:

答案 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)