Python json 모듈에서 개행 문자 "\r\n" 또는 " \n" 포함된 string을 json.loads() 함수로 dictionary로 객체로 변환할 때 발생하는 에러입니다. 개행 문자가 포함된 경우 json.loads() 함수 호출 시 "JSONDecodeError():Invalid control character" 에러가 발생하며 수정 방법은 ① json.loads() 호출 시 strict=True 값으로 전달하는 방법과 ② 원본 스트링에서 문구를 치환하는 방법 2가지가 있습니다.
에러 발생 예제
import json
json_str = """{
"이름": "홍길동",
"나이": 25,
"문장": "첫 줄 문장 \n 두 번째 문장"
}"""
jdata_obj = json.loads(json_str)
print (type(jdata_obj))
print (jdata_obj)
발생 에러: JSONDecodeError() 에러 발생
Traceback (most recent call last):
File "/Users/kibua20/git/DevDocs/test_json.py", line 15, in <module>
jdata_obj = json.loads(json_str, strict=True)
File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 359, in loads
return cls(**kw).decode(s)
File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid control character at: line 4 column 18 (char 50)
수정 방법 #1: json.loads( str, strict=False) 호출
import json
json_str = """{
"이름": "홍길동",
"나이": 25,
"문장": "첫 줄 문장 \n 두 번째 문장"
}"""
jdata_obj = json.loads(json_str, strict=False)
print (type(jdata_obj))
→ <class 'dict'="">
print (jdata_obj)
→ {'이름': '홍길동', '나이': 25, '문장': '첫 줄 문장 \n 두 번째 문장'}
아래 Python 공식 문서에 의하면 https://docs.python.org/ko/3/library/json.html#json.JSONDecodeError JSONDecoder에서 문자열 안에 제어 문자(\n, \t, \r, \0)가 기본 값으로는 허용되지 않으며 이를 허용하기 위해서는 strict=False로 전달하면 해당 제어 문자를 Json Decoder에서 허용합니다.
수정 방법 #2: string 변환 \n을 \\n으로 치환
개행 문자 \n 앞에 역 슬래쉬를 하나 더 붙여 줍니다. 이 경우 json_str 전체에 대해서 replace 하는 경우에 다른 개행 문자까지 모두 치환되어 json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes가 발생할 수 있으니 주의해야 합니다.
json_str = """{
"이름": "홍길동",
"나이": 25,
"문장": "첫 줄 문장 \\n 두 번째 문장"
}
"""
jdata_obj = json.loads(json_str)
print (jdata_obj)
→ {'이름': '홍길동', '나이': 25, '문장': '첫 줄 문장 \n 두 번째 문장'}
관련 글:
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Apple App Store 사용자 댓글(리뷰) 데이터 수집하기 (Sample code 포함)
[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법
[SW 개발/Python] - Python 2.x에서 3.x으로 코드 자동 변환
[SW 개발/Python] - Python에서 URL 한글 깨짐 현상: quote_plus()와 unquote_plus()
[SW 개발/Python] - Python 음수 인덱스: line.split('+')[-1] 또는 line.split('/')[-1] 의미
[SW 개발/Python] - Python: xmltodict를 활용하여 XML를 JSON으로 변환하는 방법
댓글