python的新增功能,我正在从服务器读取JSON对象,JSON对象的大小不固定。我正在根据socket.recv(1024)中指定的缓冲区大小从服务器获取数据。如何检查从服务器套接字接收到的JSON对象是否已完成/已完成,因为解析该JSON时出现错误。 请注意,我的JSON对象未嵌套。
****示例代码****
def get_data():
s = socket.socket()
host = 'IP_Address'
port = 'Port_Number'
# connection to hostname on the port.
s.connect((host, port))
msg=''
while(True):
msg = s.recv(1024)
print(msg.decode('ascii'))
jsonObject=json.loads(msg.decode('ascii'))
s.close()
以下是错误
Traceback (most recent call last):
File "d:/xxxxxxxxxxxxx/Python_Test.py", line 26, in <module>
get_data()
File "d:/xxxxxxxxxxxxx/Python_Test.py", line 20, in get_data
temp=json.loads(msg.decode('ascii'))
File "xxxxxxxxxxxxx\Python\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "xxxxxxxxxxxxx\Python\Python37\lib\json\decoder.py", line 340, in decode
raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 777)
答案 0 :(得分:1)
您在每个循环中均接收1024个字节,并且如果json对象大于该对象,则必须处理未完成 json字符串。
此外,您可能有两个1024字节甚至更多的json对象。您可以将代码更改为以下代码
def get_data():
s = socket.socket()
host = 'IP_Address'
port = 'Port_Number'
s.connect((host, port))
msg=''
while True:
r = s.recv(1024)
msg += r.decode('ascii')
while True:
start = msg.find("{")
end = msg.find("}")
if start==-1 or end==-1: # if can not find both { and } in string
break
jsonObject=json.loads(msg[start:end+1]) # only read { ... } and not another uncompleted data
# do whatever you want with jsonObject here
msg = msg[end+1:]
s.close()
注意:仅当您的数据中没有嵌套的json时,此代码才能正常工作(例如:{"device_id": {"another_json": "something"}}
)