Добавление к массиву JSON с помощью Python приводит к появлению дополнительных слэшей в выходном файле с двойной кодировкой? - PullRequest
0 голосов
/ 07 августа 2020

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

Код клиента:

import os
import sys
import json
import requests

userData = {}
userData.update({
    'email':'bob@gmail.com',
    'password':'12345',
    'payment_ref' : 'a34fqw4'
    })
# userData = json.dumps(userData)
print(userData)
url = "<address>: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('gameData.json') as file:
            self.wfile.write(file.read().encode())

    def do_POST(self):
        self.data_string = self.rfile.read(int(self.headers['Content-Length'])) 
        self.send_response(200)
        self.end_headers()
        data = self.data_string.decode()

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

        print('Appending 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 Listening on Port 4758...')
httpd = HTTPServer(('', 4758), SimpleHTTPRequestHandler)
httpd.serve_forever()

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

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

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

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

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

...