programing

Python json.loads의 제어 문자가 잘못되었습니다.

sourcejob 2023. 2. 23. 22:45
반응형

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'.

당신의 json 텍스트에는 오류가 없습니다.

문자열을 문자열 리터럴로 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

반응형