關於json序列化時報錯json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)


1.今天在寫客戶端與服務端交互的程序的時候,發現了一個問題

客戶端代碼

#客戶端程序主要是發送注冊請求/登錄請求給服務端,服務端接收響應后回應對應的應答給客戶端,客戶端接收響應后,然后做一些操作

# ### 客戶端
import socket
import hashlib
import json

def register(sk):
    name = input('請輸入注冊用戶名')
    pwd = input("請輸入注冊密碼")
    pwd2 = input("請再次輸入注冊密碼")
    dic = {'username':name,'password':pwd,'password2':pwd,'status':1}
    sk.send(json.dumps(dic).encode())
    res = sk.recv(1024)
    return res

def login(sk):
    name = input('請輸入賬戶')
    pwd = input('請輸入密碼')
    hs = hashlib.md5()
    hs.update(pwd.encode())
    res = hs.hexdigest()
    dic = {'username': name, 'password': res, 'password2': res, 'status': 2}
    #發送數據
    sk.send(json.dumps(dic).encode())
    res = sk.recv(1024)
    return res
#1.創建對象
sk = socket.socket()

#2.創建連接
sk.connect(('127.0.0.1',9001))

#.接收發數據
num = input('請輸入注冊1,登陸2')
if num == '1':
    res = register(sk)
    print(res.decode())
elif num == '2':
    res = login(sk)
    print(res.decode())
else:
    print("輸入有誤請重新輸入")

#斷開連接
sk.close()

服務端代碼

# ### 服務端
import hashlib
import json
import socketserver
import os

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        conn = self.request
        while True:
            msg = conn.recv(1024)#接收的是字節流
            strvar = msg.decode() #轉換為字符串
            print(strvar)
            json.loads(strvar) #反序列化成字典
            print(json)
            # if not msg:break  #先把這段話去掉
            if json.loads(msg.decode())['status'] == 1:
                with open('mysql.json','r+',encoding='utf-8') as fp:
                    if not os.path.getsize('mysql.json'):
                        hs = hashlib.md5()
                        hs.update(json.loads(msg.decode())['password'].encode())
                        hs_res = hs.hexdigest()
                        dic = {"username": json.loads(msg.decode())['username'], "password": hs_res}
                        json.dump(dic, fp)
                        fp.write('\n')
                        print('注冊成功')
                        conn.send('注冊成功'.encode())
                        break
                    else:
                        for i in fp:
                            dic_res = json.loads(i)
                            if dic_res["username"] == json.loads(msg.decode())['username']:
                                print('用戶名已注冊')
                                conn.send("用戶名已注冊".encode())
                                break
                            elif json.loads(msg.decode())['username'] not in dic_res["username"]:
                                hs = hashlib.md5()
                                hs.update(json.loads(msg.decode())['password'].encode())
                                hs_res = hs.hexdigest()
                                dic = {"username":json.loads(msg.decode())['username'],"password":hs_res}
                                json.dump(dic,fp)
                                fp.write('\n')
                                print('注冊成功')
                                conn.send('注冊成功'.encode())
                                break
            elif  json.loads(msg.decode())['status'] == 2:
                with open('mysql.json', 'r', encoding='utf-8') as fp:
                    for i in fp:
                        dic_res = json.loads(i)
                        if dic_res["username"] == json.loads(msg.decode())['username'] and dic_res["password"] == json.loads(msg.decode())['password']:
                            print('賬戶密碼正確,登錄成功')
                            conn.send('賬戶密碼正確,登錄成功'.encode())
                            break
                        else:
                            print('賬戶或密碼錯誤')
                            conn.send('賬戶或密碼錯誤'.encode())
                            break


server = socketserver.ThreadingTCPServer(('127.0.0.1',9001),MyServer)
server.serve_forever()

問題主要出現在客戶端發送請求給服務端的時候,服務端報了個json.decoder.JSONDecodeError的問題,但是客戶端最后運行的結果顯示是正確的

下面是服務端報的錯誤

 

 首先我在客戶端找了下,發送的數據是沒有問題的

 

 然后去服務端在接收字節流的時候發現出現了問題

 

 然而在打印屏幕上服務端顯示的卻是這樣,多了次接收並打印,很顯然是又傳了一次空的字節過來,然后在網上找了一下解決辦法,都沒有相關的解決辦法,都說是跟單引號雙引號的關系,然而並不是,最后我想了個辦法,它這邊會多傳一個空字節過來,我服務端接收的時候,加了個判斷,if not msg:break ,然后把前面的打印全刪了,只留一個msg來接收客戶端傳過來的字節, 然后再運行的時候,服務端就沒有這種JsonDecondeError的問題了

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM