2016-05-12 3 views
1

Ich habe ein Problem mit der Analyse von JSON-Daten in ein Diktat, das ich nicht herausfinden kann.Verwenden von json.loads in Python 2.7 gibt Unicode-Objekt anstelle von dict zurück

ich zu einem Tornado websocket von JavaScript bin verbinden und die folgenden Daten zu senden, trat in ein Textfeld:

{"action": "something"} 

Die Art, wie ich es in die websocket bin das Senden ist:

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

Jetzt in Python ich habe den folgenden Code in meinem 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) 

Und th e Ausgabe von dieser ist:

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

Jetzt erwarten würde ich die zweite gedruckte Nachricht ein dict zu sein, und ich kann nicht herausfinden, warum dies nicht funktioniert. Jede Hilfe würde sehr geschätzt werden.

+0

Leider verwenden, wenn ich falsch verstanden habe, aber Inhalte: { „action“ : "START_QUESTION_SELF"} ist eigentlich ein Diktat. –

+0

Verwenden Sie Python2 oder 3? –

+0

@ M.T, benutze ich Python 2.7 – Revell

Antwort

3

Es weil funktioniert nicht, wenn Sie sock.send(JSON.stringify('{"action": "something"}')); tun Sie das

"{\"action\": \"something\"}" senden Wenn Sie die Nachrichten drucken können Sie überprüfen, ob es tatsächlich Anführungszeichen enthält. Daher wird es als eine Zeichenfolge von json.loads interpretiert.

einfachste Lösung wäre json.loads wieder aufrufen:

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

aber Sie sollten wirklich überlegen Textfeld Wert in ein Objekt konvertieren und dann JSON.stringify auf es zu benutzen. Etwas wie folgt aus:

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

Ich änderte das Senden der Daten an: 'sock.send (. JSON.stringify (JSON.parse ($ ('Textfeld') Wert)));' Und nun ein Diktat für das Python-Ende. Vielen Dank! – Revell

+0

@Revell Huh. Ich habe gerade die gleiche Lösung vorgeschlagen :) – Alik

0

Ich scheint, wie die Zeichenfolge entgangen ist (\") und damit json.loads sieht es als einfacher String.
Versuchen Sie unescape message vor dem Aufruf json.loads.

ich den gleichen Fehler habe, wenn JSONField in Modellen und Einstellung der json dieser

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

Statt

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