trouble-shooting
TypeError: Object of type datetime is not JSON serializable
fffman
2022. 11. 11. 01:26
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)