我遇到了将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
,我无法弄清楚为什么这不起作用。任何帮助将不胜感激。
答案 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'