programing

python에서 datetime 객체의 json 직렬화가 datetime 객체에 대해 즉시 작동하지 않는 이유는 무엇입니까?

powerit 2023. 3. 9. 22:22
반응형

python에서 datetime 객체의 json 직렬화가 datetime 객체에 대해 즉시 작동하지 않는 이유는 무엇입니까?

datetime 객체에 대해 json 직렬화가 작동하지 않는 이유는 무엇입니까?json 시리얼화를 이해하고 있기 때문에 모든 오브젝트의 기본 아이디어는__str__builtin 함수를 사용하여 응답으로 받은 개체를 urlencode합니다.그러나 datetime의 경우 다음과 같은 오류가 발생합니다.

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable

가 있는 한__str__즉, 이미 사용 가능한 오브젝트를 묶는 방법, 그러나 그것은 그것을 하지 않는 의식적인 결정처럼 보인다. 왜 그럴까?

아니, 그건 그렇게 되지 않아json모듈.모듈에는 다음과 같은 기본 인코더가 있습니다.json.JSONEncoder이 기능을 확장하여 구현해야 합니다.default개체를 직렬화하는 메서드입니다.다음과 같은 경우:

import json
import datetime
from time import mktime

class MyEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return int(mktime(obj.timetuple()))

        return json.JSONEncoder.default(self, obj)

print json.dumps(obj, cls=MyEncoder)

다른 사람들이 정확하게 지적했듯이, 그 이유는 json의 표준이 날짜 시간을 어떻게 나타낼 수 있는지를 규정하지 않기 때문입니다.

어떻게 연재하길 원하십니까?

JSON은 날짜를 처리하는 방법을 지정하지 않기 때문에 Python은json라이브러리에서는 이러한 내용을 어떻게 나타낼지 결정할 수 없습니다.이는 상대편(브라우저, 스크립트 등)이 JSON에서 날짜를 어떻게 처리하느냐에 따라 완전히 달라집니다.

json 모듈을 패치하여 날짜/시간을 지원하는 간단한 방법입니다.

import json
import datetime

json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)

평소처럼 json serialization을 사용합니다.이번에는 datetime이 isoformat으로 serialization 됩니다.

json.dumps({'created':datetime.datetime.now()})

결과: '{"created": '2015-08-26T14:21:31.853855'}'

자세한 내용과 주의 사항은 StackOverflow: Python과 JavaScript 사이의 JSON datetime에서 확인하십시오.

데이터 타임의 부호화와 디코딩을 실장하지 않고 취득하고 싶은 경우는, json_tricks 를 사용합니다.json_tricks 는 다양한 일반적인 타입의 부호화와 디코딩을 추가하는 래퍼입니다.설치만 하면 됩니다.

pip install json_tricks

다음에서 Import합니다.json_tricks대신json예:

from json_tricks import dumps, loads
json = dumps({'name': 'MyName', 'birthday': datetime.datetime(1992, 5, 23, 18, 38, 23, 37566)})
me = loads(json)

면책사항: 제가 만든 것입니다.왜냐하면 나도 같은 문제가 있었거든.


문자열화할 수 있는 모든 것을 자동으로 시리얼화하려면 표준 구현만으로 쉽게 실행할 수 있습니다.

dumps(obj, default=str)

단, 이 방법에는 단점이 있습니다.예를 들어, 불필요한 노력이 없으면 어느 것도 시리얼화 해제되지 않습니다.또한 (큰 numpy 배열의 함수 등) 어떤 것을 시리얼화하지 않고 대신 경고를 받고 싶은 경우도 있습니다.이 경우 이 방법은 무음 상태가 됩니다.

언급URL : https://stackoverflow.com/questions/10721409/why-does-json-serialization-of-datetime-objects-in-python-not-work-out-of-the-bo

반응형