我可以在 Pydantic 中创建自动转换为日期时间的 Unix 时间类型吗?

Mar*_*oma 5 python pydantic

我收到一个带有 unix 时间戳的 JSON 响应,例如:

{"protocol": "http", "isPublic": false, "startTime": 1607586354631}
Run Code Online (Sandbox Code Playgroud)

使用 Pydantic 读取此数据的最简单方法是将其注释startTimeint. 我想将其注释为UnixMicrotime或类似的,以便 Pydantic 也将其解析为日期时间(并在序列化时将日期时间转换回 UnixMicrotime)。那可能吗?

最小的例子

{"protocol": "http", "isPublic": false, "startTime": 1607586354631}
Run Code Online (Sandbox Code Playgroud)

给出

protocol='http' isPublic=False startTime=1607586354631
Run Code Online (Sandbox Code Playgroud)

但我希望它是:

protocol='http' isPublic=False startTime=2020-12-10T08:45:54
Run Code Online (Sandbox Code Playgroud)

ale*_*ame 6

您可以将其注释为datetime解析它,并添加自定义json_encoder以将其序列化为datetimeunix 时间。样本:

import json
from datetime import datetime

from pydantic import BaseModel

json_str = """{"protocol": "http", "isPublic": false, "startTime": 1607586354631}"""
data_dict = json.loads(json_str)


class Data(BaseModel):
    protocol: str
    isPublic: bool
    startTime: datetime


data = Data.parse_obj(data_dict)
print(data.json())


class DataWithUnixTime(BaseModel):
    protocol: str
    isPublic: bool
    startTime: datetime

    class Config:
        json_encoders = {
            datetime: lambda v: v.timestamp(),
        }


data = DataWithUnixTime.parse_obj(data_dict)
print(data.json())
Run Code Online (Sandbox Code Playgroud)
{"protocol": "http", "isPublic": false, "startTime": "2020-12-10T07:45:54.631000+00:00"}
{"protocol": "http", "isPublic": false, "startTime": 1607586354.631}
Run Code Online (Sandbox Code Playgroud)