본문 바로가기
SW 개발/Python

Python으로 개행 문자(\n)가 포함된 JSON 읽기: JSONDecodeError 수정하기

by Kibua20 2021. 7. 14.

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에서 허용합니다. 

 

Python 공식 문서

 

 

수정 방법 #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 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Selenium과 BeautifulSoup을 활용하여 Google PlayStore 사용자 리뷰 (댓글) 가져오기 (Sample Code 포함)

[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Dataframe(또는 Numpy)를 JSON 출력 시 에러: TypeError: Object of type int64 is not JSON serializable

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - 우분투 20.04에서 Jupyter Notebook 사용법: Web browser에서 Python 개발 환경 구축

[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으로 변환하는 방법




댓글