使用 pydantic 對 , 等float欄位進行 json 編碼時,我遇到了一些意外行為。int這是json編碼的檔案,供參考。
例如,這個模型似乎編碼complex得很好,但忽略了我的float領域。
import pydantic as pd
class Model(pd.BaseModel):
class Config:
arbitrary_types_allowed=True
json_encoders = {
float: lambda x: 'test',
complex: lambda x: 'test'
}
d1:float
d2:complex
m = Model(d1=1.0, d2=1j)
m.json()
# '{"d1": 1.0, "d2": "test"}'
任何人都可以闡明這種行為并指出我正確的方向嗎?
我的用例是一個自定義編碼器,用于檢測 a 何時float是numpy.inf,然后將其寫入"Infinity"json 而不是包Infinity編碼的非法默認值。json
謝謝你的幫助!
uj5u.com熱心網友回復:
您的自定義 json_encoder 不適用于float型別的原因是pydantic用于json.dumps()序列化。如果任何型別是可序列化的,json.dumps()它將不會對這些型別使用 cutom json_encoder。
并找到complex它不可序列化的型別,json.dumps()這就是它使用您提供的自定義 json_encoder 的原因。
如果您仍想使用自定義 json_encoder,您可以按照 pydantic 的建議使用orjson。
自定義 JSON(反)序列化
示例代碼:
def orjson_dumps(v, *, default):
for key, value in v.items():
if isinstance(value, float):
v[key] = 'test'
elif isinstance(value, complex):
v[key] = 'test'
# orjson.dumps returns bytes, to match standard json.dumps we need to decode
return orjson.dumps(v, default=default).decode()
class Model(BaseModel):
class Config:
arbitrary_types_allowed=True
json_dumps = orjson_dumps
json_loads = orjson.loads
d1:float
d2:complex
m = Model(d1=1.0, d2=1j)
m.json() # {"d1":"test","d2":"test"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442690.html
下一篇:貓鼬將每個物件推入陣列中
