Python json.loads 时报错无效控制字符

102 投票
4 回答
142923 浏览
提问于 2025-04-17 22: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)

我遇到了这个错误 -

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

你的 JSON 文本没有错误。

如果你把这个字符串直接复制粘贴到 Python 代码里作为字符串常量,就可能会出现错误。在这种情况下,\n 会被当作一个单独的字符(换行符)来处理。你可以通过使用原始字符串来解决这个问题(用 r'')。如果你想在字符串里包含双引号或单引号,可以使用三重引号 r'''..''',这样就不用担心转义问题了。

撰写回答