在Python 2.7中使用json.loads会返回unicode对象而不是dict

时间:2016-05-12 08:09:16

标签: javascript python json dictionary unicode

我遇到了将JSON数据解析为dict的问题,这是我无法弄清楚的。

我从JavaScript连接到Tornado websocket并发送以下数据,输入文本字段:

{"action": "something"}

我将它发送到websocket的方式是:

sock.send( JSON.stringify( $('textfield').value ) );

现在在Python中,我在WebsocketHandler :: on_message()中有以下代码:

print("Message type: " + str(type(message)) + ", content: " + message)

parsed_message = json.loads(message)

print("Parsed message type: " + str(type(parsed_message)) + ", content: " + parsed_message)

这个输出是:

Message type: <type 'unicode'>, content: "{\"action\":\"START_QUESTION_SELF\"}"
Parsed message type: <type 'unicode'>, content: {"action":"START_QUESTION_SELF"}

现在我希望第二条打印的消息是dict,我无法弄清楚为什么这不起作用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

它不起作用,因为当您执行sock.send(JSON.stringify('{"action": "something"}'));时,您发送此"{\"action\": \"something\"}"

当您打印消息时,您可以验证它实际上是否包含引号。因此,它被json.loads解释为字符串。

最简单的解决方案是再次调用json.loads

parsed_message = json.loads(json.loads(message))

但是,您应该考虑将文本字段值转换为对象,然后在其上使用JSON.stringify。像这样:

sock.send(JSON.stringify(JSON.parse( $('textfield').value)));

答案 1 :(得分:0)

我的字符串似乎已被转义(\"),因此json.loads将其视为纯字符串。
在致电message之前尝试unescape json.loads

在模型中使用JSONField并将json设置为此

时,我遇到了同样的错误
content='{"content":"Hello A","numbers":[1,2,3,4]}'
# json.loads(model.content) --> type 'str'

而不是

content={"content":"Hello A","numbers":[1,2,3,4]}
# json.loads(model.content) --> type 'dict'