2014-03-14 92 views
14

下面是我的字符串,這是獲得打印出與下面的代碼 -無效的控制字符

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

print jsonString 

而下面是得到了打印出來的控制檯上的串 -

{"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"} 

但是,當我使用python json.loads加載了這一點,如圖所示如下─

jStr = json.loads(jsonString) 

我剛開g這個錯誤 -

ERROR Invalid control character at: line 1 column 202 (char 202) 

我看着char 202,但我不知道爲什麼導致一個問題?在我的記事本++ char 202是e我猜..或者可能是我的計算錯了

任何想法是什麼錯?如何找出哪一個導致問題。

更新: -

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] 

下面的錯誤,我得到了 -

KeyError: 202 
+1

你看字202了嗎? –

+0

@Ignacio Vazquez-Abrams:我看着它,但我不知道爲什麼會導致問題?我的記事本++中的char 202是'e'我猜..或者可能是我計算錯了 – ferhan

+0

嘗試'print jsonString [202]' – metatoaster

回答

15

There is no error in your json text.

你可以得到錯誤,如果你的字符串複製,粘貼到你的Python源代碼作爲一個字符串。在這種情況下,\n被解釋爲單個字符(換行符)。您可以使用原始字符串代替(r'',使用三重引號r'''..'''以避免在字符串文字中引用"'引號)來解決此問題。

+0

這個答案和我的沒什麼不同。在'r'前加上你的字符串(使它成爲一個字符串文字)可以逃脫你的換行符。問題在於OP的代碼。如果OP確實'打印jsonString'後面跟着'json.loads(jsonString)',他就不會遇到這個錯誤。否則,他的控制檯輸出將不會顯示文字\ n,而是換行符。 – Pakman

+0

@Pakman:不正確。我的回答:*「你的json文本沒有錯誤。」*。你的回答:*「逃避你的換行符」。* – jfs

+0

你的陳述「你的json文本沒有錯誤」是正確的,但是他輸入到json.loads中的文本中有一個錯誤,我們都是在 – 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"} 

爲我工作。另外,如果將來出現類似這樣的錯誤,您可以使用的調試技術是將字符串縮短爲可以正常工作的字符串,然後緩慢地添加數據,直到它不再出現爲止。

+0

那麼它應該在202字符之前抱怨?爲什麼它在202上抱怨? – ferhan

33

控制字符可以在字符串中被允許如下,

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

100 upvotes to you –

+0

這對我有用,因爲我對json字符串的格式沒有影響。 – pansen

+0

謝謝@NikhilParmar你是一個拯救生命的人:)我從最近3天就一直在努力解決這個問題,最後這個爲我工作 –