[英]Is there a convention for JSON serialization of Python objects?
是否有 JSON 序列化(和反序列化)Python 對象的約定來識別 object 類型? 我已經瀏覽了下面的這個示例解決方案(我發現它經過輕微修改后相當不錯),但我仍然想知道:是否存在任何安全問題,它是否足夠清晰?
結果(注意添加了 __type__ 屬性)
{
"__type__": "date",
"year": 2022,
"month": 1,
"day": 1
}
從以下代碼打印:
import json
from datetime import date, timedelta
class MyJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, date):
return {
'__type__' : 'date',
'year' : obj.year,
'month' : obj.month,
'day' : obj.day
}
elif isinstance(obj, timedelta):
return {
'__type__' : 'timedelta',
'days' : obj.days,
'seconds' : obj.seconds,
'microseconds' : obj.microseconds,
}
# And more and more classes to support
else:
return super().default(self, obj)
class MyJSONDecoder(json.JSONDecoder):
SUPPORTING_TYPES = {'date': date, 'timedelta': timedelta}
def __init__(self):
super().__init__(object_hook=self.dict_to_object)
def dict_to_object(self, d):
if '__type__' in d and d['__type__'] in self.SUPPORTING_TYPES:
obj_type = self.SUPPORTING_TYPES[d.pop('__type__')]
return obj_type(**d)
return d
# And to encode / decode
d = date(2022,1,1)
serialized_d = json.dumps(d, cls=MyJSONEncoder)
print(serialized_d)
d_ = json.loads(serialized_d, cls=MyJSONDecoder)
assert d == d_ # Assertion check
你的方法對我來說似乎足夠合理。 但是,如果我在做一個類似的項目,我會盡量簡化它,以簡化序列化過程的兩端。
例如,我不會將 datetime 對象分解為年月和日,而是將它存儲在時間戳或 isoformat 中,具體取決於我需要它的可讀性。 這將使轉換為 json 像date_time_obj.isoformat()
一樣簡單,轉換回 datetime 將是datetime.fromisoformat()
。
TimeDelta 也是如此。 根據它需要的可讀性,我只需將整個增量存儲為秒,這將減少要解析的項目數量並將序列化代碼減少到timedelta.total_seconds()
和timedelta(seconds=arg)
。 但是,非常大的增量將難以閱讀。
話雖如此……您的方法很簡單,所以我想說差異是完全主觀的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.