我接受来自websocket的一些二进制数据。
我正在尝试json.loads(data)
,但我得到ValueError
抛出
打印它我得到以下结果(这是有效的json):
{"session":"SeFKQ0SfYZqhh6FTCcKZGw==","authenticate":1,"id":1791}
但是当我进一步检查字符串时,print
将这个怪物变成了上面的json:
'{\x00"\x00s\x00e\x00s\x00s\x00i\x00o\x00n\x00"\x00:\x00"\x00S\x00e
\x00F\x00K\x00Q\x000\x00S\x00f\x00Y\x00Z\x00q\x00h\x00h\x006\x00F
\x00T\x00C\x00c\x00K\x00Z\x00G\x00w\x00=\x00=\x00"\x00,\x00"\x00a
\x00u\x00t\x00h\x00e\x00n\x00t\x00i\x00c\x00a\x00t\x00e\x00"\x00:
\x001\x00,\x00"\x00t\x00h\x00r\x00e\x00a\x00d\x00_\x00i\x00d\x00"
\x00:\x001\x007\x009\x001\x00}\x00'
这是什么回来,我怎样才能做一些有意义的事情(通过json.loads
将其变成原生字典)?
答案 0 :(得分:5)
您的数据似乎是UTF-16编码,小端,没有BOM(字节顺序标记)。
我会先尝试用utf16-le
解码器解码它:
data = data.decode('utf-16le')
然后使用json.loads(data)
加载它。
data = '{\x00"\x00s\x00e\x00s\x00s\x00i\x00o\x00n\x00"\x00:\x00"\x00S\x00e\x00F\x00K\x00Q\x000\x00S\x00f\x00Y\x00Z\x00q\x00h\x00h\x006\x00F\x00T\x00C\x00c\x00K\x00Z\x00G\x00w\x00=\x00=\x00"\x00,\x00"\x00a\x00u\x00t\x00h\x00e\x00n\x00t\x00i\x00c\x00a\x00t\x00e\x00"\x00:\x001\x00,\x00"\x00t\x00h\x00r\x00e\x00a\x00d\x00_\x00i\x00d\x00"\x00:\x001\x007\x009\x001\x00}\x00'
data = data.decode('utf16-le')
print json.loads(data)
输出:
{u'thread_id': 1791, u'session': u'SeFKQ0SfYZqhh6FTCcKZGw==', u'authenticate': 1}