2010-09-11 25 views

回答

1

您將負責編寫python來對您的類進行編碼和解碼。你如何編碼它們?這將對你如何解碼他們有很大的影響。如果你超越了字典,列表,Unicode,字符串,整數,浮點數,布爾值和None,Python不會爲你做任何事情。

對自定義類進行編碼的規範方法是子類json.JSONEncoder並提供default方法。 default方法的簽名爲'self, obj',並返回obj編碼在json中,如果它知道如何並返回super(clsname, self).default(obj)如果沒有。

如果您將類編碼爲字典,那麼您可以編寫一個接受一個參數(解碼字典)的函數並從中返回解碼對象。然後將該函數傳遞給json.JSONDecoder的構造函數,並在該實例上使用decode方法。

總而言之,json並不適合串行化複雜的類。如果你可以捕捉整個函數的狀態,以便它可以傳遞給init方法,那麼就可以使用它,但如果沒有,那麼你只會傷到你的頭。

2

json.dumps(somepython)給你代表Python對象somepython(它可以非常清楚是列表)和json.loads(ajsonstring)走另一條路「圓一個有效的JSON字符串 - (?)都沒有任何安全問題,也不是‘投’。在Python 2.6或更高版本中,使用標準庫中的json模塊。如果您遇到2.5(例如,用於Google App Engine),則可以使用等效的第三方模塊simplejson

+0

你所說的對於用戶定義的類是完全不正確的。你必須實現一個自定義編碼器來完成這個工作。 – aaronasterling 2010-09-11 02:40:06

+0

@aaron,'json.loads'將_never_返回「用戶定義的類」--JSON標準中沒有這樣的東西,所以,這不是很明顯嗎?因此,如果並且當你想要轉儲任何東西,但是JSON定義的類型(和/或從JSON重新加載到非JSON定義的類型),顯然你需要選擇和編碼你自己的專有編碼(大概是爲了知道交易另一端的Javascript也是如此;-)。這完全不限於用戶定義的類,順便說一句:大量Python自帶的內置類型(例如,複數!)也超出了JSON標準。 – 2010-09-11 05:13:37

+0

絕對正確。正如我應該在我的原始評論中指出的那樣,OP正在詢問用戶定義的類的編碼實例。 – aaronasterling 2010-09-11 05:26:24

相關問題