Python json.loads 时报错无效控制字符
下面是我用以下代码打印出来的字符串 -
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)
我查看了字符 202,但我不知道为什么会出现问题?在我的 Notepad++ 中,字符 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 个回答
-3
{"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"}
对我来说是有效的。
另外,如果将来你遇到类似的错误,可以试试一种调试方法:先把字符串缩短到一个能正常工作的状态,然后慢慢添加数据,直到出现问题为止。
17
试着在使用 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 '}
262
在字符串中可以允许使用控制字符,方法如下:
json_str = json.loads(jsonString, strict=False)
你可以在 Python 2 的文档 或者 Python 3 的文档 中找到相关信息。
如果设置为不严格(
True
是默认值),那么字符串中就可以包含控制字符。在这里,控制字符是指那些字符编码在 0 到 31 范围内的字符,包括'\t'
(制表符)、'\n'
(换行符)、'\r'
(回车符)和'\0'
(空字符)。
93
如果你把这个字符串直接复制粘贴到 Python 代码里作为字符串常量,就可能会出现错误。在这种情况下,\n
会被当作一个单独的字符(换行符)来处理。你可以通过使用原始字符串来解决这个问题(用 r''
)。如果你想在字符串里包含双引号或单引号,可以使用三重引号 r'''..'''
,这样就不用担心转义问题了。