无法解析来自python中套接字的JSON(非嵌套JSON)对象

时间:2019-03-13 07:05:32

标签: python json sockets

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)

1 个答案:

答案 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"}}