#python #json #sql-server #udp #client
#питон #json #sql-сервер #udp #клиент
Вопрос:
Я получил эту ошибку от JSON, которая возникает только тогда, когда я пытаюсь запросить таблицу с более чем 25 строками. Есть ли способ получить больше строк из запроса? Как и сейчас, я использую top(20)
свой запрос для решения этой проблемы. Вот код со стороны клиента, со стороны сервера и ошибка под ним.
Клиент
clientSocket=socket(AF_INET,SOCK_DGRAM) sql='4' send=json.dumps({"a":sql}) clientSocket.sendto(send.encode(),(serverName,serverPort)) message,serverAddress=clientSocket.recvfrom(2048) message=json.loads(message.decode()) message=message.get("a") clientSocket.close() clientSocket=socket(AF_INET,SOCK_DGRAM) sql='2' ID=int(input()) choice=switch(1) book=int(input()) arr=[] if(IDlt;=len(message)): arr.append(ID) for p in range(len(choice)): if(choice[p][0]==book): arr.append(choice[p][0]) if(len(arr)lt;2): return send=json.dumps({"a":sql,"b":arr}) clientSocket.sendto(send.encode(),(serverName,serverPort)) message,serverAddress=clientSocket.recvfrom(2048) print(message[2000:2060]) message=json.loads(message.decode()) le=int(len(message.get("a"))-1) me=message.get("a") print('%s ss0s0s'%(me[0][0],me[0][1],me[0][2],me[0][3],me[0][4])) print(message.get("a")[le-1]) clientSocket.close()
Сервер (я включаю только sql='2'
часть, так sql='4'
как имеет тот же базовый код).
message, clientAddress=serverSocket.recvfrom(2048) message=json.loads(message.decode()) result=pd.read_sql('SELECT 1',cnxn).values arr=message.get("b") sql="EXEC MASTERBORROW @ID_STUDENT=?,@ID_BOOK=?,@COMMAND='ADD'" cursor.execute(sql,arr) cnxn.commit() result=pd.read_sql("EXEC MASTERBORROW @COMMAND='SELECT'",cnxn) result['ID_BORROW']=result['ID_BORROW'].astype(str) result['BORROW_DATE']=result['BORROW_DATE'].astype(str) result['RETURN_DATE']=result['RETURN_DATE'].astype(str) result=result.values returns=json.dumps({"a":result.tolist()}) serverSocket.sendto(returns.encode(),(clientAddress))
Это один из результатов. Первая строка взята из, print(message[2000:2060])
которая показывает, что в запросе нет ничего плохого.
b'01 09:22:24.057", "2021-12-08 23:59:59.997"], ["' Traceback (most recent call last): File "/Python/Cient.py", line 160, in lt;modulegt; switch(comm) File "/Python/Cient.py", line 64, in switch message=json.loads(message.decode()) File "/usr/lib/python3.9/json/__init__.py", line 346, in loads return _default_decoder.decode(s) File "/usr/lib/python3.9/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python3.9/json/decoder.py", line 353, in raw_decode obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 2048 (char 2047)
Это некоторые другие результаты. Никаких изменений в коде. Это случайно в зависимости от того, какой элемент я выбрал на входе
json.decoder.JSONDecodeError: Expecting value: line 1 column 2049 (char 2048) json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 2049 (char 2048) json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 2043 (char 2042)
Это из-за того, что я использую UDP, или это что-то другое?
Комментарии:
1. Похоже, что анализатор JSON разбивается на 2048 байтах, что имеет смысл, потому что буфер датаграмм составляет 2048 байтов.
2. Примечание:
print(message[2000:2060])
отпечаткиb'01 09:22:24.057", "2021-12-08 23:59:59.997"], ["'
… что составляет 48 байт, а не 60.3. ох, черт возьми, я виноват. я скопировал часть кода из своего более старого несвязанного проекта, спасибо, что указали на это