Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将数据编辑为JSON_Python_Json - Fatal编程技术网

使用Python将数据编辑为JSON

使用Python将数据编辑为JSON,python,json,Python,Json,我有一个简单的JSON { "users":[ { "last result": "2%", "login": "user", "password": "1", "id": "1" } ] } 我想添加新用户,然后按ID删除用户 例如: 我想补充一点: {"id":"2", "login": "admin", "password":"22", "las

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

您应该使用
w
而不是
a+
打开
auth.json
。当您使用
a+
打开时,这意味着您将输出附加到其中,而不是覆盖它。

请尝试此代码

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)

您的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)