2014-11-01 82 views
0

我有一个奇怪的问题没有JSON对象可以解码。有效的JSON

我有一个计划,通过套接字发送一个JSON字符串:

json_string = JSONEncoder().encode({ 
    "id_movil": str(id_movil), 
    "correo": "[email protected]" 
}) 

socket_client.sendall(json_string) 

在服务器上,我有:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host, port)) 
s.listen(1) 
conn, addr = s.accept() 
buffer_json = conn.recv(1024) 
data = json.loads(buffer_json) 

然后,一个异常抛出:

Traceback (most recent call last): 

    data = json.loads(buffer_json) 
    File "/usr/lib/python2.7/json/__init__.py", line 326, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

当我更改“correo “在json从"[email protected]"[email protected]或任何其他字符串异常不再抛出。

PS。只有在使用套接字时才抛出异常。当我在Python shell上使用json.loads时,它的工作原理是

+0

'conn.recv'返回的数据与传递给'socket_client.sendall'的数据相同吗?你检查了吗? – jwodder 2014-11-01 02:16:17

+0

是的,是一样的。为了准确,这个:{“correo”:“[email protected]”,“id_movil”:“15”} – imarban 2014-11-01 02:18:29

回答

0

嗯,我没有看到你发布的代码部分有什么问题,所以我冒昧地重新创建缺少的比特,因为我认为它们是合适的。

服务器:

import json 
import socket 

host, port = "127.0.0.1", 9696 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host, port)) 
s.listen(1) 
conn, addr = s.accept() 
buffer_json = conn.recv(1024) 
data = json.loads(buffer_json) 
print(data) 

客户:

import json 
import socket 

id_movil = 5 

json_string = json.JSONEncoder().encode({ 
    "id_movil": str(id_movil), 
     "correo": "[email protected]" 
     }) 

socket_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
socket_client.connect(("127.0.0.1",9696)) 
socket_client.sendall(json_string) 

当我运行它,它运行得很好。所以你的问题要么是网络分割数据,所以它不会一次性完成(不太可能考虑到数据的大小,但可能),或者你没有向我们展示的代码段。 如果它是前者,那么你将不得不循环conn.recv()直到所有的数据都通过。

+0

但是,如果是网络分割数据,那么把一个更大的字符串不应该来一气呵成,发生了。 – imarban 2014-11-01 02:35:22

+0

@imarban然后,错误是在你决定不与我们分享的代码中。 – 2014-11-01 02:36:10

+0

此外,我收到了我发送的 – imarban 2014-11-01 02:36:24