Python json.loads的控制字符无效

时间:2014-03-14 01:10:09

标签: python json

下面是我用以下代码打印出来的字符串 -

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)

我收到此错误 -

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

我查看了char 202,但我不知道为什么会导致问题?在我的记事本++中的字符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

4 个答案:

答案 0 :(得分:82)

控制字符可以在字符串中允许,如下所示,

json_str = json.loads(jsonString, strict=False)

您可以在docs for python 2the docs for python 3

中找到此信息
  

如果strict为false(默认为True),则字符串中将允许控制字符。此上下文中的控制字符是字符代码在0-31范围内的字符,包括'\t'(制表符),'\n''\r''\0'

答案 1 :(得分:26)

There is no error in your json text.

如果将字符串作为字符串文字复制粘贴到Python源代码中,则可能会出现错误。在这种情况下,\n被解释为单个字符(换行符)。您可以使用原始字符串文字来修复它(r'',使用三引号r'''..'''来避免在字符串文字中转义"'引号。)

答案 2 :(得分:2)

尝试在 json.loads 中使用 "strict=False" ,它会忽略 "\n" 和另一个控制字符。如下:

import json
  
test_string = ' { "key1" : "1015391654687" , "key2": "value2 \n " } '

res = json.loads(test_string, strict=False)
  
print(res)

输出:

{'key1': '1015391654687', 'key2': 'value2 \n '}

答案 3 :(得分:-1)

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

适合我。

此外,如果您将来遇到这样的错误,您可以使用的调试技术是将字符串缩短为可以正常运行的字符串,然后慢慢添加数据,直到它没有。