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