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"}
하지만 파이썬을 사용해서 이걸 로딩하면json.loads아래와 같이
jStr = json.loads(jsonString)
이 에러가 발생하고 있습니다.
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
제어문자는 다음과 같이 문자열 안에 사용할 수 있습니다.
json_str = json.loads(jsonString, strict=False)
이것은 python 2용 문서 또는 python 3용 문서에서 찾을 수 있습니다.
엄격하면 false(
True는 디폴트입니다).이 경우 문자열 내에 제어 문자를 사용할 수 있습니다.이 컨텍스트의 제어 문자는 다음과 같은 0 ~31 범위의 문자 코드를 가진 문자입니다.'\t'(탭),'\n','\r'그리고.'\0'.
문자열을 문자열 리터럴로 Python 소스 코드에 복사하여 붙여넣으면 오류가 발생할 수 있습니다.그 경우\n는 단일 문자(뉴라인)로 해석됩니다.대신 raw-string 리터럴을 사용하여 수정할 수 있습니다.r'', 세 개의 따옴표를 사용합니다.r'''..'''도망가지 않도록 하다"'따옴표로 묶습니다).
json.false에서 "strict=False"를 사용하려고 하면 "\n" 및 다른 Control 문자가 무시됩니다.다음과 같은 경우:
import json
test_string = ' { "key1" : "1015391654687" , "key2": "value2 \n " } '
res = json.loads(test_string, strict=False)
print(res)
출력:
{'key1': '1015391654687', 'key2': 'value2 \n '}
{"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"}
저는 좋아요.
또한 나중에 이와 같은 오류가 발생할 경우 사용할 수 있는 디버깅 기법으로는 문자열의 길이를 줄여 사용할 수 없는 문자열이 될 때까지 천천히 데이터를 추가하는 방법이 있습니다.
언급URL : https://stackoverflow.com/questions/22394235/invalid-control-character-with-python-json-loads
'programing' 카테고리의 다른 글
| jQuery ajax 성공 콜백 함수 정의 (0) | 2023.02.23 |
|---|---|
| SQL을 사용하여 날짜 범위 생성 (0) | 2023.02.23 |
| 단일 파일에 대해 더 예쁜 파일 사용 안 함 (0) | 2023.02.23 |
| grunt 서버를 사용하여 모든 요청을 루트 URL로 리다이렉트하려면 어떻게 해야 합니까? (0) | 2023.02.23 |
| Wordpress - 쿼리 문자열을 슬래시 기반 URL로 전달 (0) | 2023.02.23 |