2014-03-14 8 views
14

Unten ist mein Zeichenfolge, die mit dem unten stehenden Code ausgedruckt wird immer -Ungültige Steuerzeichen mit Python json.loads

jsonString = data.decode("utf-8") 

print jsonString 

Und unten ist die Zeichenfolge, die auf der Konsole ausgedruckt wurde -

{"description":"Script to check testtbeat of TEST 1 server.", "script":"#!/bin/bash\nset -e\n\nCOUNT=60 #number of 10 second timeouts in 10 minutes\nSUM_SYNCS=0\nSUM_SYNCS_BEHIND=0\nHOSTNAME=$hostname  \n\nwhile [[ $COUNT -ge \"0\" ]]; do\n\necho $HOSTNAME\n\n#send the request, put response in variable\nDATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/heartbeat)\n\n#grep $DATA for syncs and syncs_behind\nSYNCS=$(echo $DATA | grep -oE 'num_syncs: [0-9]+' | awk '{print $2}')\nSYNCS_BEHIND=$(echo $DATA | grep -oE 'num_syncs_behind: [0-9]+' | awk '{print $2}')\n\necho $SYNCS\necho $SYNCS_BEHIND\n\n#verify conditionals\nif [[ $SYNCS -gt \"8\" && $SYNCS_BEHIND -eq \"0\" ]]; then exit 0; fi\n\n#decrement the counter\nlet COUNT-=1\n\n#wait another 10 seconds\nsleep 10\n\ndone\n"} 

Aber wenn ich diese json.loads als unten-

jStr = json.loads(jsonString) 

ich Gettin gezeigt mit python laden aus bin g Dieser Fehler -

Ich sah Char 202, aber ich habe keine Ahnung, warum das ein Problem verursacht? Char 202 in meinem Notizblock ++ ist e Ich denke .. Oder kann ich es falsch berechnen

Irgendeine Idee was ist falsch? Wie finde ich heraus, welches Problem verursacht?

UPDATE: -

jsonString = {"description":"Script to check testtbeat of TIER 1 server.", "script":"#!/bin/bash\nset -e\n\nCOUNT=60 #number of 10 second timeouts in 10 minutes\nSUM_SYNCS=0\nSUM_SYNCS_BEHIND=0\nHOSTNAME=$hostname  \n\nwhile [[ $COUNT -ge \"0\" ]]; do\n\necho $HOSTNAME\n\n#send the request, put response in variable\nDATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/heartbeat)\n\n#grep $DATA for syncs and syncs_behind\nSYNCS=$(echo $DATA | grep -oE 'num_syncs: [0-9]+' | awk '{print $2}')\nSYNCS_BEHIND=$(echo $DATA | grep -oE 'num_syncs_behind: [0-9]+' | awk '{print $2}')\n\necho $SYNCS\necho $SYNCS_BEHIND\n\n#verify conditionals\nif [[ $SYNCS -gt \"8\" && $SYNCS_BEHIND -eq \"0\" ]]; then exit 0; fi\n\n#decrement the counter\nlet COUNT-=1\n\n#wait another 10 seconds\nsleep 10\n\ndone\n"} 

print jsonString[202] 

Below Fehler Ich habe -

KeyError: 202 
+1

Hast Du bei der Charakter sah 202 noch? –

+0

@Ignacio Vazquez-Abrams: Ich sah es an, aber ich habe keine Ahnung, warum das ein Problem verursacht? Char 202 in meinem Editor ++ ist 'e' ich denke .. Oder kann ich es falsch berechnen – ferhan

+0

versuchen' print jsonString [202] ' – metatoaster

Antwort

15

There is no error in your json text.

Sie können die Fehlermeldung erhalten, wenn Sie die Zeichenfolge in Ihren Python-Quellcode als Stringliteral copy-paste. In diesem Fall wird \n als ein einzelnes Zeichen interpretiert (Newline). Sie können es jedoch mit Hilfe von Raw-String-Literalen beheben (r'', Verwenden Sie Triple-Anführungszeichen r'''..''', um zu vermeiden, "' Anführungszeichen im String-Literal zu umgehen).

+0

Diese Antwort ist nicht anders als meins. Wenn Sie Ihre Zeichenfolge mit 'r' vorzeichenlos machen (dies wird zu einem Zeichenfolgenliteral), werden Ihre Zeilenumbrüche nicht mehr angezeigt. Das Problem liegt beim OP-Code.Wenn OP wirklich "jsonString" gefolgt von "json.loads (jsonString)" ausgegeben hätte, wäre er nicht auf diesen Fehler gestoßen. Sonst hätte seine Konsolenausgabe kein Literal \ n sondern einen Zeilenumbruch angezeigt. – Pakman

+0

@Pakman: falsch. Meine Antwort: * "Es gibt keinen Fehler in Ihrem JSON-Text." *. Ihre Antwort: * "Escape your newlines." * – jfs

+0

Ihre Aussage "Es gibt keinen Fehler in Ihrem JSON-Text" ist richtig, aber es war _was_ ein Fehler in dem Text, den er in json.loads eingegeben hat, die wir beide – Pakman

0

Escape your newlines.

{"description":"Script to check testtbeat of TEST 1 server.", "script":"#!/bin/bash\\nset -e\\n\\nCOUNT=60 #number of 10 second timeouts in 10 minutes\\nSUM_SYNCS=0\\nSUM_SYNCS_BEHIND=0\\nHOSTNAME=$hostname  #dc1dbx1145.dc1.host.com\\n\\nwhile [[ $COUNT -ge \\"0\\" ]]; do\\n\\necho $HOSTNAME\\n\\n#send the request, put response in variable\\nDATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/heartbeat)\\n\\n#grep $DATA for syncs and syncs_behind\\nSYNCS=$(echo $DATA | grep -oE 'num_syncs: [0-9]+' | awk '{print $2}')\\nSYNCS_BEHIND=$(echo $DATA | grep -oE 'num_syncs_behind: [0-9]+' | awk '{print $2}')\\n\\necho $SYNCS\\necho $SYNCS_BEHIND\\n\\n#verify conditionals\\nif [[ $SYNCS -gt \\"8\\" && $SYNCS_BEHIND -eq \\"0\\" ]]; then exit 0; fi\\n\\n#decrement the counter\\nlet COUNT-=1\\n\\n#wait another 10 seconds\\nsleep 10\\n\\ndone\\n"} 

Arbeiten für mich.

Auch wenn Sie in Zukunft einen solchen Fehler erhalten, können Sie mit einer Debugging-Methode die Zeichenfolge auf etwas verkürzen, das funktioniert, und langsam Daten hinzufügen, bis es nicht mehr funktioniert.

+0

Dann sollte es sich auch vor 202 Zeichen beschwert haben? Warum hat es sich dann bei 202 beschwert? – ferhan

33

Das Steuerzeichen kann wie folgt in einem String erlaubt sein,

jStr = json.loads(jsonString, strict=False) 
+1

100 upvotes zu dir –

+0

Das funktionierte für mich, da ich keinen Einfluss darauf habe, wie die JSON-Zeichenfolge formatiert wurde. – pansen

+0

Danke @NikhilParmar Du bist ein Lebensretter :) Ich habe mit diesem Problem von den letzten 3 Tagen gekämpft und schließlich hat dieser für mich gearbeitet –

Verwandte Themen