Ho un Python set
che contiene oggetti __hash__
e __eq__
metodi per assicurarsi che nessun duplicato sia incluso nella raccolta.
Ho bisogno di json codificare questo risultato set
, ma passare anche un vuoto set
al json.dumps
metodo genera un 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
So che posso creare un'estensione per la json.JSONEncoder
classe che ha un default
metodo personalizzato , ma non sono nemmeno sicuro da dove iniziare la conversione su set
. Devo creare un dizionario dai set
valori all'interno del metodo predefinito e quindi restituire la codifica su quello? Idealmente, vorrei rendere il metodo predefinito in grado di gestire tutti i tipi di dati su cui l'encoder originale soffoca (sto usando Mongo come fonte di dati, quindi le date sembrano sollevare anche questo errore)
Qualsiasi suggerimento nella giusta direzione sarebbe apprezzato.
MODIFICARE:
Grazie per la risposta! Forse avrei dovuto essere più preciso.
Ho usato (e valutato) le risposte qui per aggirare i limiti della set
traduzione, ma ci sono anche chiavi interne che sono un problema.
Gli oggetti nel set
sono oggetti complessi che si traducono in __dict__
, ma essi stessi possono anche contenere valori per le loro proprietà che potrebbero non essere idonei per i tipi di base nel codificatore json.
Ci sono molti tipi diversi in questo set
, e l'hash calcola fondamentalmente un ID univoco per l'entità, ma nel vero spirito di NoSQL non si può dire esattamente cosa contiene l'oggetto figlio.
Un oggetto potrebbe contenere un valore di data per starts
, mentre un altro potrebbe avere qualche altro schema che non include chiavi contenenti oggetti "non primitivi".
Questo è il motivo per cui l'unica soluzione che mi è venuta in mente è stata quella di estendere la JSONEncoder
sostituzione del default
metodo per attivare casi diversi, ma non sono sicuro di come procedere e la documentazione è ambigua. Negli oggetti nidificati, il valore restituito da default
va per chiave o è solo un generico include / discard che esamina l'intero oggetto? In che modo quel metodo accetta valori nidificati? Ho esaminato le domande precedenti e non riesco a trovare l'approccio migliore alla codifica specifica del caso (che sfortunatamente sembra ciò che dovrò fare qui).
dict
s? Penso che tu voglia fare solo unlist
set dal set e poi passarlo all'encoder ... ad esempio:encode(list(myset))