프로그래밍 언어/Python

"JSON 직렬화 가능하지 않은 datetime.datetime"을 극복하는 방법

Rateye 2021. 6. 16. 10:27
728x90
반응형
질문 : "JSON 직렬화 가능하지 않은 datetime.datetime"을 극복하는 방법은 무엇입니까?

다음과 같은 기본 사전이 있습니다.

sample = {}
sample['title'] = "String"
sample['somedate'] = somedatetimehere

jsonify(sample) 시도하면 다음과 같은 결과가 나타납니다.

TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable

사전 샘플이 위의 오류를 극복 할 수 있도록 어떻게해야합니까?

참고 : 관련성이 없을 수도 있지만 사전은 mongodb 에서 str(sample['somedate']) 를 출력하면 출력은 2012-08-08 21:46:24.862000 입니다.

답변

원래 답변은 MongoDB "날짜"필드가 다음과 같이 표현 된 방식을 수용했습니다.

{"$date": 1506816000000}

datetime 을 json으로 직렬화하는 일반적인 Python 솔루션을 원한다면 @jjmontes의 답변 에서 종속성이 필요하지 않은 빠른 솔루션을 확인하십시오.

mongoengine (댓글 당)을 사용하고 pymongo가 종속성이므로 pymongo에는 json 직렬화를 돕는 내장 유틸리티가 있습니다.
http://api.mongodb.org/python/1.10.1/api/bson/json_util.html

사용 예 (직렬화) :

from bson import json_util
import json

json.dumps(anObject, default=json_util.default)

사용 예 (역 직렬화) :

json.loads(aJsonString, object_hook=json_util.object_hook)

Django는 이러한 종류의 올바르게 처리 DjangoJSONEncoder

https://docs.djangoproject.com/en/dev/topics/serialization/#djangojsonencoder 참조

from django.core.serializers.json import DjangoJSONEncoder

return json.dumps(
  item,
  sort_keys=True,
  indent=1,
  cls=DjangoJSONEncoder
)

DjangoJSONEncoder 와 다음과 default 사용하는 것의 차이점은 다음과 같습니다.

import datetime
import json

def default(o):
    if isinstance(o, (datetime.date, datetime.datetime)):
        return o.isoformat()

return json.dumps(
  item,
  sort_keys=True,
  indent=1,
  default=default
)

Django가 약간의 데이터를 제거합니까?

 "last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder 
 "last_login": "2018-08-03T10:51:42.990239", # default

따라서 어떤 경우에는 조심해야 할 수도 있습니다.

출처 : https://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable
728x90
반응형