簡體   English   中英

JSON在列表/二進制中序列化Python中的對象

[英]JSON serialize objects in Python in list / diconary

我對Python還是很陌生,我有一個相當大而復雜的數據結構,它是一個字典列表,其中包含不同對象的列表。 當我嘗試通過json.dumps()將其轉換為JSON時,我得到了標准

TypeError: <...> is not JSON serializable

我做了一些研究,大多數答案都指向編寫自定義編碼器的標准方法,這很好,我可以做到。 但是,我希望能夠將我的整個數據結構發送到json.dumps(),而不是遍歷所有內容,弄清楚它是什么類,並從頭開始構建json對象。

有沒有一種方法可以向python類本身添加編碼器/解碼器功能,所以當我向json.dumps發送復雜的數據結構時,該類本身知道該怎么做。

有什么神奇的to_json或某種方法添加自定義解碼器到當json.dumps遇到該類時被調用的類嗎?

當您使用json.dumps(my_object, cls=MyCustomJsonEncoder)時,自定義編碼器類將為您處理該問題。 您的自定義編碼器會覆蓋default方法,該default方法使用self和對象o進行編碼; 測試需要自定義序列化的不同類型,然后使用super(MyCustomJsonEncoder, self).default(o)將其余類型傳遞給默認類型。

我經常使用的一個簡單示例如下:

class JSONEncoder(json.JSONEncoder):
    """
    Enhancement of base JSONEncoder, also handling these objects:
     * datetime.datetime
     * decimal.Decimal
     * uuid.UUID
    """

    def default(self, o):
        if isinstance(o, Decimal):
            return float(o)
        elif isinstance(o, UUID):
            return str(o)
        elif isinstance(o, datetime):
            return {
                '__type__': 'datetime',
                '__value__': o.isoformat(),
            }
        return super(JSONEncoder, self).default(o)

    @staticmethod
    def dumps(obj):
        return json.dumps(obj, cls=JSONEncoder)

正如史蒂文·沃爾夫(Steven Wolfe)在此線程中所述 ,您可能需要研究jsonpickle 該庫允許對復雜的Python對象進行編碼和解碼。

您可以通過以下方式使用它:

import jsonpickle

f = open(filename, 'w')
encoded_string = jsonpickle.encode(obj)
f.write(encoded_string)
f.close()

要將數據檢索為Python對象,只需使用jsonpickle.decode(encoded_string)方法。 如文檔所述:

新對象具有相同的類型和數據,但現在基本上是原始對象的副本。

我認為這可能對您有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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