2022년 10월 15일 토요일

json.decoder.JSONDecodeError: Invalid control character at line XX column XX (char XX)

 

json.decoder.JSONDecodeError: Invalid control character at 오류 해결법

먼저 오류 상황을 알아보도록 하겠습니다.

import json
import yaml
code_yaml = "" \
'''
"a": "안녕하세요\n반갑습니다."
'''
code_json = "" \
'''
{
"a":"안녕하세요\n반갑습니다."
}
'''
print(code_yaml)
yaml_data = yaml.load(code_yaml, Loader=yaml.FullLoader)
print(yaml_data)

print(code_json)
json_data = json.loads(code_json)
print(json_data)

위와 같은 경우 실행을 시키면 아래와 같은 형태의 오류가 발생합니다.

Traceback (most recent call last):
  File "C:/Users/jun/Documents/GitHub/sourcecode/python/example/_40_yaml_json/json_load_decoder_exception.py", line 18, in <module>
    json_data = json.loads(code_json)
  File "C:\Users\jun\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\jun\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\jun\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid control character at: line 3 column 18 (char 27)

오류가 발생하는 사유는 

https://docs.python.org/ko/3/library/json.html#json.JSONDecoder

strict가 거짓이면 (True가 기본값입니다), 문자열 안에 제어 문자가 허용됩니다. 이 문맥에서 제어 문자는 0–31 범위의 문자 코드를 가진 것들인데, '\t' (탭), '\n', '\r' 및 '\0'을 포함합니다.

기본적으로 제어 문자는 json 문자에서는 표현이 안된다고 합니다. 이것을 해결하기 위해서는 strict 옵션을 사용해야 하는데 아래는 사용 예제입니다.

import json
code = "" \
'''
{
"a":"안녕하세요\n반갑습니다."
}
'''
print(code)

json_data = json.loads(code, strict=False)
print(json_data)

아주 간단합니다.

아래는 실행 결과 입니다.

{
"a": "안녕하세요
반갑습니다."
}

{'a': '안녕하세요\n반갑습니다.'}


참고로 이 현상은 yaml 에서는 발생하지 않습니다.

제일 앞에 예제에서 yaml 부분과 같이 실행한 코드가 있습니다.



댓글 없음:

댓글 쓰기