我应该在json.dumps(...)之后编码吗?

时间:2016-11-20 23:48:02

标签: python json python-2.7 encoding character-encoding

据我所知,我现在总是解码来自我的脚本(Python Web服务器)的用户输入。
我总是编码输出,例如当我从服务器向客户端发送数据时,在websocket连接中。

我应该这样做:

ws.send(json.dumps({'message' : message, 'id': i}))

ws.send(json.dumps({'message' : message, 'id': i}).encode('utf8'))

第一个在Python 2.7中似乎没问题,因为似乎json.dumps(...)的结果已经编码:

print type(json.dumps({'message' : message, 'id': i}))
# <type 'str'>

问题:

.encode('utf8')之后我们应该json.dumps()吗?

1 个答案:

答案 0 :(得分:1)

通常,通过套接字连接发送和接收的数据是客户端和服务器之间的握手。客户端应发送服务器可接受的数据,无论是utf-8还是latin都无关紧要。

简而言之,请执行您喜欢的任何编码,但请记住您的服务器期望相同。

关于你的问题:

  

在json.dumps()之后我们应该.encode('utf8')吗?

以下是一个例子:

>>> a = {'a': 'Hello'}
>>> str_a = json.dumps(a)    # type(str_a) --> <class 'str'>
>>> bytes_a = json.dumps(a).encode('utf8')   # type(bytes_a)  --> <class 'bytes'>

让我们检查两者的内存大小:

>>> import sys
>>> sys.getsizeof(str_a)
63
>>> sys.getsizeof(bytes_a)
47

Cleary bytes字符串比普通字符串消耗更少的内存。发送编码数据以减少网络使用是更好的选择。对于通过套接字的数据传输,这是一个需要考虑的主要因素。