반응형
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
반응형
'MySql' 카테고리의 다른 글
MySQL SQL 쿼리 결과를 PANDAS 데이터 구조로 변환하는 방법은 무엇입니까? (0) | 2021.02.01 |
---|---|
MySQL LEFT JOIN 및 INNER JOIN을 사용하여 삽입 (0) | 2021.02.01 |
MySQL 임시 테이블에서 UNION ALL을 할 수 없습니까? (0) | 2021.02.01 |
MySQL mysqldump 테이블 구조없이 데이터 추출 (0) | 2021.02.01 |
MySQL SQL : 검색 / 바꾸지 만 레코드에 값이 처음 나타날 때만 (0) | 2021.02.01 |
댓글