簡體   English   中英

Python 對象的 JSON 序列化是否有約定?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM