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 부분과 같이 실행한 코드가 있습니다.