python의 json.dumps를 사용하다가 만나게 되는 에러다. json.dumps는 내부에서 JSONEncoder를 사용해서 직렬화를 하는데 해당 라이브러리에서 지원하는 타입이 아니면 에러를 발생시키기 때문인다.
가장 간단한 해결방법으로는 아래와 같이 코딩하는 방법이 있다.
json.dumps(dict_obj, default=str)
자 이제 에러가 나지 않는다. 그런데 우리가 원한 형태의 직렬화가 맞는가? 만약 아니라면 해결방법을 찾아보자. 일단 JSONEncoder는 아래와 같은 타입만 기본적으로 변환해준다.
class JSONEncoder(object):
"""Extensible JSON <https://json.org> encoder for Python data structures.
Supports the following objects and types by default:
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
그리고 해당 위 명시되지 않은 타입에 대해서는 default파라미터에 입력된 함수를 통해 변환시켜 주는 것이다. 따라서 default에 해당하는 함수만 잘 만들어주면 해결 될 것이라는 걸 알 수 있다.
import json
from datetime import datetime as dt
test_dict = {
'now': dt.now(),
}
def default_encode(obj):
return obj.strftime('%Y%m%d%H%M%S')
text = json.dumps(test_dict, default=default_encode)
print(text)
'trouble-shooting' 카테고리의 다른 글
TypeError: can't subtract offset-naive and offset-aware datetimes (0) | 2022.11.22 |
---|---|
유니코드 정규화 문제 (NFC, NFD) (0) | 2022.11.21 |
[python] generator는 일회용? (map, filter와 같은 함수를 쓸 때 생기는 문제) (0) | 2022.11.11 |
json.dumps 한글 (0) | 2022.11.09 |
IndexError: list index out of range (0) | 2022.11.08 |