集合的JSON 序列化:解決類型衝突
遇到集合時,由於其固有類型與JSON 不相容,JSON 序列化會失敗。 Python 集本身不是 JSON 可序列化的。為了解決這個問題,可以使用自訂編碼器來規避類型衝突。
用於集合處理的自訂編碼器
自訂 JSON 編碼器,例如 SetEncoder,可以建立來處理集合。此編碼器會覆寫預設行為,並在序列化集合之前將集合轉換為清單。
<code class="python">class SetEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) return json.JSONEncoder.default(self, obj)</code>
透過將此自訂編碼器傳遞給json.dumps,可以成功序列化集合:
<code class="python">data_str = json.dumps(set([1,2,3,4,5]), cls=SetEncoder) print(data_str) # Output: '[1, 2, 3, 4, 5]'</code>
處理集合中的複雜物件
集合可能包含複雜對象,例如日期值或具有自訂屬性的對象。為了處理這種情況,自訂編碼器的預設方法可以執行類型檢查並傳回適當的 JSON 表示。
例如,要保留設定類型並將自訂物件編碼為字串:
<code class="python">class SetEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return {'type': 'set', 'values': list(obj)} if isinstance(obj, ComplexObject): return str(obj) return json.JSONEncoder.default(self, obj)</code>
此自訂編碼器識別集合,將它們轉換為帶有「type」鍵的字典,並傳回複雜物件的字串表示形式。
集合中的巢狀類型
JSON 序列化集合內的巢狀類型需要自訂編碼器的遞歸應用。當集合中的物件不可 JSON 序列化時,編碼器將呼叫自身來序列化底層元素。
例如,要處理同時包含數字和複雜對象的集合:
<code class="python">class SetEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, set): return list(obj) if isinstance(obj, ComplexObject): return {'type': 'ComplexObject', 'details': obj.__dict__} return json.JSONEncoder.default(self, obj)</code>
該編碼器識別複雜的對象,並將它們轉換為帶有“type”鍵的字典,可以在反序列化過程中使用它來重新建立原始物件結構。
以上是如何序列化 JSON 中的集合:解決類型衝突並處理複雜物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!