2012-09-18 64 views
2

我試圖寫一個使用JSON對象進行溝通,正在運行與自定義類的麻煩的程序。基本上我進入json.dumps的對象是一個大字典,大多隻是使用基本類(字符串,列表和其他字典居多),但在某些情況下,我有一個字符串映射到自定義類A的對象如何實現自定義類的默認序列化方法?

當我使用這些對象,我得到一個消息,如:

TypeError: <module.A object at 0x01659110> is not JSON serializable 

我想要做的就是寫類型A的對象的默認編碼方法的對象是非常簡單,只包含一個標籤( str類型)和一些各種整數。標籤足以唯一標識A,所以如果json單獨使用標籤,那很好。

在線閱讀很多類似的問題後,我結束了:

class AEncoder(json.JSONEncoder): 
    def default(self, o): 
     if isinstance(o, A): 
      return o.label 
     else: 
      return super(AEncoder, self).default(o) 

的問題是,我得到的來源來自所有包括調用,比如:

AEncoder().encode(object) 

這必須是所謂的傳遞對象到json.dumps()之前,但我沒有訪問對象事前。它隱藏在前面提到的大型字典中,有時不能被我訪問。我也嘗試實施的__repr__功能,但我得到了同樣的錯誤。

因此...嘗試一個彙總版本:如何告訴json.dumps()當我無法訪問傳入json.dumps()的特定對象時,如何處理自定義類?

請讓我知道是否需要任何澄清。

回答

1

您傳遞cls參數傳遞給dump功能:

json.dumps(obj, cls=AEncoder) 

下面是一個例子用法:

>>> class Something(object): 
... def __init__(self, v): 
...  self.v = v 
... 
>>> import json 
>>> class SEncoder(json.JSONEncoder): 
... def default(self, obj): 
...  if isinstance(obj, Something): 
...   return {'classtype': 'Something', 'v': obj.v} 
...  return json.JSONEncoder.default(self, obj) 
... 
>>> s1 = Something(3) 
>>> s2 = Something(4) 
>>> o = [s1, s2, 6, "hello"] 
>>> print json.dumps(o, cls=SEncoder, indent=2) 
[ 
    { 
    "classtype": "Something", 
    "v": 3 
    }, 
    { 
    "classtype": "Something", 
    "v": 4 
    }, 
    6, 
    "hello" 
] 
+0

,似乎工作,謝謝。 – Morag

相關問題