1importdatetime 2importdecimal 3importjson 4importuuid 5 6fromplain.utils.durationimportduration_iso_string 7fromplain.utils.functionalimportPromise 8fromplain.utils.timezoneimportis_aware 91011classPlainJSONEncoder(json.JSONEncoder):12"""13 JSONEncoder subclass that knows how to encode date/time, decimal types, and14 UUIDs.15 """1617defdefault(self,o):18# See "Date Time String Format" in the ECMA-262 specification.19ifisinstance(o,datetime.datetime):20r=o.isoformat()21ifo.microsecond:22r=r[:23]+r[26:]23ifr.endswith("+00:00"):24r=r.removesuffix("+00:00")+"Z"25returnr26elifisinstance(o,datetime.date):27returno.isoformat()28elifisinstance(o,datetime.time):29ifis_aware(o):30raiseValueError("JSON can't represent timezone-aware times.")31r=o.isoformat()32ifo.microsecond:33r=r[:12]34returnr35elifisinstance(o,datetime.timedelta):36returnduration_iso_string(o)37elifisinstance(o,decimal.Decimal|uuid.UUID|Promise):38returnstr(o)39else:40returnsuper().default(o)