Python에서 "datetime.datetime은 JSON 직렬화 불가능" 오류 해결 방법
Python에서 datetime
객체를 JSON으로 직렬화하려고 할 때 "datetime.datetime은 JSON 직렬화 불가능" 오류가 발생할 수 있습니다. 이는 JSON이 기본적으로 날짜 및 시간 형식을 지원하지 않기 때문입니다.
해결 방법
이 오류를 해결하려면 다음 방법 중 하나를 사용할 수 있습니다.
날짜 및 시간을 문자열로 변환
datetime
객체를 JSON으로 직렬화하기 전에 ISO 8601 형식과 같은 표준 날짜 및 시간 형식 문자열로 변환합니다. 다음은 strftime()
메서드를 사용하여 이를 수행하는 방법입니다.
import datetime
dt = datetime.datetime(2024, 6, 14, 18, 21, 23)
json_str = dt.strftime('%Y-%m-%dT%H:%M:%S')
print(json_str) # 출력: 2024-06-14T18:21:23
사용자 정의 JSON 인코더 사용
json.JSONEncoder
의 default
속성을 사용하여 datetime
객체를 JSON으로 직렬화하는 방법을 정의하는 사용자 정의 인코더를 만들 수 있습니다. 다음은 예시입니다.
import datetime
import json
def datetime_handler(obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%dT%H:%M:%S')
return json.JSONEncoder.default(obj)
json_str = json.dumps({'dt': datetime.datetime(2024, 6, 14, 18, 21, 23)}, default=datetime_handler)
print(json_str) # 출력: {"dt": "2024-06-14T18:21:23"}
타사 라이브러리 사용
dateutil
또는 pendulum
과 같은 타사 라이브러리를 사용하여 datetime
객체를 JSON으로 직렬화하는 데 도움을 받을 수 있습니다. 이러한 라이브러리는 일반적으로 날짜 및 시간 작업을 위한 추가 기능을 제공하며, JSON 직렬화와 같은 작업을 수월하게 합니다.
주의 사항
datetime
객체를 JSON으로 직렬화할 때 사용하는 날짜 및 시간 형식은 상황에 따라 다를 수 있습니다. 필요에 따라 다른 형식을 사용할 수 있습니다.- 사용자 정의 인코더를 사용하는 경우 해당 인코더가 처리해야 하는 모든 객체 유형을 올바르게 처리하는지 확인해야 합니다.
예제 코드
import datetime
dt = datetime.datetime(2024, 6, 14, 18, 21, 23)
json_str = dt.strftime('%Y-%m-%dT%H:%M:%S')
print(json_str) # 출력: 2024-06-14T18:21:23
import datetime
import json
def datetime_handler(obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%dT%H:%M:%S')
return json.JSONEncoder.default(obj)
json_str = json.dumps({'dt': datetime.datetime(2024, 6, 14, 18, 21, 23)}, default=datetime_handler)
print(json_str) # 출력: {"dt": "2024-06-14T18:21:23"}
타사 라이브러리 사용 (dateutil)
import datetime
import json
from dateutil import tz
dt = datetime.datetime(2024, 6, 14, 18, 21, 23, tzinfo=tz.tzutc())
json_str = json.dumps({'dt': dt}, default=lambda obj: obj.isoformat())
print(json_str) # 출력: {"dt": "2024-06-14T18:21:23Z"}
설명
- 위 코드는 세 가지 방법 모두를 보여주는 간단한 예제입니다.
- 실제 코드에서는 필요에 따라 날짜 및 시간 형식, 사용자 정의 인코더 로직 또는 사용하는 타사 라이브러리를 변경해야 할 수도 있습니다.
대체 방법
datetime 객체를 튜플로 변환
datetime
객체를 (year, month, day, hour, minute, second, microsecond)
형식의 튜플로 변환한 다음 JSON으로 직렬화할 수 있습니다. 다음은 예시입니다.
import datetime
import json
dt = datetime.datetime(2024, 6, 14, 18, 21, 23)
json_str = json.dumps(dt.timetuple())
print(json_str) # 출력: [2024, 6, 14, 18, 21, 23, 0]
time 모듈 사용
time
모듈의 strftime()
함수를 사용하여 datetime
객체를 원하는 형식의 문자열로 변환한 다음 JSON으로 직렬화할 수 있습니다. 다음은 예시입니다.
import datetime
import json
import time
dt = datetime.datetime(2024, 6, 14, 18, 21, 23)
json_str = json.dumps({'dt': time.strftime('%Y-%m-%dT%H:%M:%S', dt.timetuple())})
print(json_str) # 출력: {"dt": "2024-06-14T18:21:23"}
iso8601 모듈 사용
iso8601
모듈을 사용하여 datetime
객체를 ISO 8601 형식 문자열로 변환한 다음 JSON으로 직렬화할 수 있습니다. 다음은 예시입니다.
import datetime
import json
import iso8601
dt = datetime.datetime(2024, 6, 14, 18, 21, 23)
json_str = json.dumps({'dt': iso8601.datetime_to_string(dt)})
print(json_str) # 출력: {"dt": "2024-06-14T18:21:23Z"}
- 위 방법들은
datetime
객체의 모든 정보를 JSON에 포함하지 않을 수 있습니다. 예를 들어microsecond
필드는 포함되지 않을 수 있습니다. - 특정 상황에 따라 적합한 방법이 다를 수 있습니다.
python json