第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何對集合進行JSON序列化?

如何對集合進行JSON序列化?

慕運維8079593 2019-10-05 14:13:22
我有一個Python set,其中包含帶有__hash__和__eq__方法的對象,以確保該集合中沒有重復項。我需要對該結果進行json編碼set,但是即使將一個空值傳遞set給該json.dumps方法也會引發(fā)TypeError。  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode    chunks = self.iterencode(o, _one_shot=True)  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode    return _iterencode(o, 0)  File "/usr/lib/python2.7/json/encoder.py", line 178, in default    raise TypeError(repr(o) + " is not JSON serializable")TypeError: set([]) is not JSON serializable我知道我可以為json.JSONEncoder具有自定義default方法的類創(chuàng)建擴展,但是我什至不確定從哪里開始轉換set。我是否應該set使用默認方法中的值創(chuàng)建字典,然后返回該方法的編碼?理想情況下,我想使默認方法能夠處理原始編碼器阻塞的所有數(shù)據(jù)類型(我將Mongo用作數(shù)據(jù)源,所以日期似乎也引發(fā)了此錯誤)向正確方向的任何提示將不勝感激。編輯:感謝您的回答!也許我應該更精確一些。我利用(并贊成)這里的答案來解決set翻譯的局限性,但是內部鍵也是一個問題。中的set對象是轉換為的復雜對象__dict__,但它們本身也可以包含其屬性值,這些值可能不符合json編碼器中的基本類型。涉及到很多不同的類型set,哈?;旧蠟閷嶓w計算了一個唯一的id,但是按照NoSQL的真正精神,沒有確切說明子對象包含什么。一個對象可能包含的日期值starts,而另一個對象可能具有其他不包含“非原始”對象鍵的其他模式。這就是為什么我唯一能想到的解決方案是擴展JSONEncoder替換default方法以打開不同情況的方法-但我不確定如何解決此問題,并且文檔不明確。在嵌套對象中,是default按鍵返回go 的值,還是只是查看整個對象的通用包含/丟棄?該方法如何容納嵌套值?我已經看過以前的問題,但似乎找不到最佳的針對特定情況的編碼的方法(不幸的是,這似乎是我在這里需要做的事情)。
查看完整描述

3 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

您可以創(chuàng)建一個自定義編碼器,list當遇到時會返回set。這是一個例子:


>>> import json

>>> class SetEncoder(json.JSONEncoder):

...    def default(self, obj):

...       if isinstance(obj, set):

...          return list(obj)

...       return json.JSONEncoder.default(self, obj)

... 

>>> json.dumps(set([1,2,3,4,5]), cls=SetEncoder)

'[1, 2, 3, 4, 5]'

您也可以通過這種方式檢測其他類型。如果需要保留列表實際上是一個集合,則可以使用自定義編碼。喜歡的東西return {'type':'set', 'list':list(obj)}可能會奏效。


要說明嵌套類型,請考慮將其序列化:


>>> class Something(object):

...    pass

>>> json.dumps(set([1,2,3,4,5,Something()]), cls=SetEncoder)

這將引發(fā)以下錯誤:


TypeError: <__main__.Something object at 0x1691c50> is not JSON serializable

這表明編碼器將獲取list返回的結果,并對其子代遞歸調用序列化器。要為多種類型添加自定義序列化程序,可以執(zhí)行以下操作:


>>> class SetEncoder(json.JSONEncoder):

...    def default(self, obj):

...       if isinstance(obj, set):

...          return list(obj)

...       if isinstance(obj, Something):

...          return 'CustomSomethingRepresentation'

...       return json.JSONEncoder.default(self, obj)

... 

>>> json.dumps(set([1,2,3,4,5,Something()]), cls=SetEncoder)

'[1, 2, 3, 4, 5, "CustomSomethingRepresentation"]'


查看完整回答
反對 回復 2019-10-05
  • 3 回答
  • 0 關注
  • 797 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號