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"]'
添加回答
舉報