Ho un Python setche 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 setal json.dumpsmetodo 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.JSONEncoderclasse che ha un defaultmetodo personalizzato , ma non sono nemmeno sicuro da dove iniziare la conversione su set. Devo creare un dizionario dai setvalori 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 settraduzione, ma ci sono anche chiavi interne che sono un problema.
Gli oggetti nel setsono 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 JSONEncodersostituzione del defaultmetodo per attivare casi diversi, ma non sono sicuro di come procedere e la documentazione è ambigua. Negli oggetti nidificati, il valore restituito da defaultva 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).
dicts? Penso che tu voglia fare solo unlistset dal set e poi passarlo all'encoder ... ad esempio:encode(list(myset))