파이썬 JSON 인코딩 오류 (Python JSON encoding error) 알아보기.

파이썬 JSON 인코딩 오류

JSON(JavaScript Object Notation)은 Key-Value 쌍으로 이루어진 데이터 오브젝트를 직렬화하고 전송하기 위해 인기 있는 데이터 교환 형식입니다. 파이썬에서는 JSON 문자열을 파싱하거나 JSON 문자열로 인코딩 할 수 있습니다. 하지만 때때로 JSON 인코딩 과정에서 오류가 발생할 수 있습니다.

1. TypeError: Object of type ‘XXX’ is not JSON serializable

JSON 형식으로 인코딩 하려는 데이터 객체가 직렬화 불가능한 상황에서 발생합니다. 대표적인 예시로는 datetime 객체와 set 객체가 있습니다.

“` python
import json
from datetime import datetime

json.dumps({‘created_at’: datetime.now()}) # TypeError 발생
“`

해당 오류를 해결하는 방법은 default 함수를 이용해 직접 직렬화하는 방법입니다.

“` python
def custom_encoder(obj):
if isinstance(obj, datetime):
return obj.strftime(‘%Y-%m-%dT%H:%M:%S’)
else:
raise TypeError(f”{type(obj)} not JSON serializable”)

json.dumps({‘created_at’: datetime.now()}, default=custom_encoder)
“`

2. ValueError: Circular reference detected

객체 내부에서 참조가 순환하는 경우 발생합니다. JSON 인코딩 시에는 참조가 없는 순수한 데이터만 인코딩할 수 있습니다.

python
data = {'username': 'Alice'}
data['self'] = data
json.dumps(data) # ValueError 발생

해당 오류를 해결하는 방법은 JSONEncoder를 상속받아 순환 참조를 방지하는 방법입니다.

“` python
class PreventCircularEncoder(json.JSONEncoder):
def init(self, args, kwargs):
super().init(
args, **kwargs)
self.seen = set()

def default(self, obj):
    if id(obj) in self.seen:
        return None
    else:
        self.seen.add(id(obj))
        return super().default(obj)

data = {‘username’: ‘Alice’}
data[‘self’] = data
json.dumps(data, cls=PreventCircularEncoder)
“`

3. UnicodeEncodeError

일부 문자열은 유니코드로 처리되지 않아 인코딩 과정에서 오류가 발생할 수 있습니다.

python
json.dumps('안녕하세요')

해당 오류는 ensure_ascii=False 모드를 이용해, 인코딩할 때 유니코드로 인코딩하도록 바꾸어줍니다.

python
json.dumps('안녕하세요', ensure_ascii=False)

JSON 인코딩 과정에서 발생하는 오류는 데이터의 형태, 내용, 파이썬 버전 등 많은 요소에 따라 다양한 경우가 있을 수 있습니다. 하지만 위에서 소개한 방식을 이용해 대부분의 오류를 처리할 수 있으니 참고하면 좋을 것입니다.