我收到一个带有 unix 时间戳的 JSON 响应,例如:
{"protocol": "http", "isPublic": false, "startTime": 1607586354631}
Run Code Online (Sandbox Code Playgroud)
使用 Pydantic 读取此数据的最简单方法是将其注释startTime为int. 我想将其注释为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)
您可以将其注释为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)