Добавление к массиву JSON с помощью Python приводит к дополнительным косым чертам в выходном файле в двойной кодировке?

#python #json #server #client

#python #json #сервер #клиент

Вопрос:

Я пытаюсь настроить простой сервер python для чтения и хранения входящих пользовательских данных из запроса POST клиента. Клиент отправляет данные в формате Json, и я хочу, чтобы сервер добавил эту информацию в существующий файл userDataBase.json.

Клиентский код:

 import os
import sys
import json
import requests

userData = {}
userData.update({
    'email':'bob@&mail.com',
    'password':'12345',
    'payment_ref' : 'a34fqw4'
    })
# userData = json.dumps(userData)
print(userData)
url = "<address&&t;:4758/"
response = requests.post(url,json=userData)
  

Серверный код

 from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import os

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        with open('&ameData.json') as file:
            self.wfile.write(file.read().encode())

    def do_POST(self):
        self.data_strin& = self.rfile.read(int(self.headers['Content-Len&th'])) 
        self.send_response(200)
        self.end_headers()
        data = self.data_strin&.decode()

        if os.path.isfile('userDataBase.json') == False:
            print('Makin& New File')
            userData = {}
            userData["users"] = []
            with open('userDataBase.json','w') as outfile:
                json.dump(userData,outfile)

        print('Appendin& userDataBase File')
        with open('userDataBase.json','r') as file:
            userData = json.load(file)
            userData["users"].append(data)
            print(userData)
        with open('userDataBase.json','w') as file:
            json.dump(userData,file,indent=4)

print('Stated Server Listenin& on Port 4758...')
httpd = HTTPServer(('', 4758), SimpleHTTPRequestHandler)
httpd.serve_forever()
  

Это почти работает, но результат выглядит следующим образом:

 ubuntu@address:~$ cat userDataBase.json
{
    "users": [
        "{"email": "jeff@&mail.com", "password": "12345", "payment_ref": "a34fqw4"}",
        "{"email": "bob@&mail.com", "password": "12345", "payment_ref": "a34fqw4"}"
    ]
}
  

Но я хочу, чтобы это выглядело так:

 {
    "users": [
        {"email": "jeff@&mail.com", "password": "12345", "payment_ref": "a34fqw4"},
        {"email": "bob@&mail.com", "password": "12345", "payment_ref": "a34fqw4"}
    ]
}
  

Я прочитал и думаю, что проблема связана с тем фактом, что я дважды кодирую входящие данные Json. Но, похоже, я не могу решить свою проблему.

Комментарии:

1. import json; {"users" : [json.loads(x) for x in userData["users"]]} ?

2. @Sushanth, я думаю, проблема в том, что я сохраняю файл. Потому что то, что я сохраняю, уже в формате Json. Итак, если я использую json.dump() объект json, то он в конечном итоге получает двойное кодирование. Я попытался сохранить в виде строки, но это тоже не сработало. Проблема, которую я вижу в вашем решении, заключается в том, что я просто получаю другой объект json, который необходимо сохранить без двойного кодирования.

3. РЕШЕНО!! ОК, @Sushanth, я думаю, у тебя была правильная идея. И это заставило меня задуматься. Мне действительно нужно использовать json.loads(). Но я делаю это сразу после «data = self.data_strin&.decode()». На этом этапе «данные» представляют собой строку и должны быть объектом Json. Итак, я создал следующую строку «data = json.loads (данные)» . И теперь это работает

4. Я думаю, проблема была не в двойном кодировании.