본문 바로가기
MySql

MySQL datetime을 지원하는 Python JSON 인코더?

by 베이스 공부 2021. 2. 1.
반응형

Python JSON 인코더가 datetime을 지원하도록 만드는 우아한 방법이 있습니까? 타사 모듈 또는 쉬운 해킹?

tornado의 데이터베이스 래퍼를 사용하여 db에서 일부 행을 가져와 json을 생성하고 있습니다. 쿼리 결과에는 일반 MySQL 타임 스탬프 열이 포함됩니다.

Python의 기본 json 인코더가 모든 종류의 데이터베이스 쿼리에서 흔히 볼 수있는 자체 datetime 유형을 지원하지 않는다는 것은 매우 성가신 일입니다.

Python 자체의 json 인코더를 수정하고 싶지 않습니다. 좋은 습관이 있습니까? 감사합니다!

추신 : Python JSON 인코더 기본 방법을 수정하여 더러운 해킹을 발견했습니다.

변화:

def default(self, o):
    raise TypeError(repr(o) + " is not JSON serializable")

에:

def default(self, o):
    from datetime import date
    from datetime import datetime
    if isinstance(o, datetime):
        return o.isoformat()
    elif isinstance(o, date):
        return o.isoformat()
    else:
        raise TypeError(repr(o) + " is not JSON serializable")

글쎄, 그것은 단지 개발 환경을위한 임시 해결책이 될 것입니다.

그러나 장기적인 솔루션이나 프로덕션 환경의 경우 이것은 매우 추악하며 새 서버에 배포 할 때마다 수정해야합니다.

더 좋은 방법이 있습니까? 나는 파이썬 코드 자체를 수정하고 싶지 않으며 Tornado 소스 코드도 수정하고 싶지 않습니다. 이를 위해 내 프로젝트 코드로 할 수있는 일이 있습니까? 바람직하게는 한 걸음으로.

감사합니다!

 

해결 방법

 



import json
import datetime


class DateTimeEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, (datetime.datetime, datetime.date, datetime.time)):
            return obj.isoformat()
        elif isinstance(obj, datetime.timedelta):
            return (datetime.datetime.min + obj).time().isoformat()

        return super(DateTimeEncoder, self).default(obj)

now = datetime.datetime.now()
encoder = DateTimeEncoder()
encoder.encode({"datetime": now, "date": now.date(), "time": now.time()})
> {"datetime": "2019-07-02T16:17:09.990126", "date": "2019-07-02", "time": "16:17:09.990126"}

 

참조 페이지 https://stackoverflow.com/questions/12122007

 

 

반응형

댓글