Eu tenho um Python setque contém objetos __hash__e __eq__métodos para garantir que não haja duplicatas incluídas na coleção.
Eu preciso json codificar esse resultado set, mas passar mesmo um vazio setpara o json.dumpsmétodo gera a 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
Eu sei que posso criar uma extensão para a json.JSONEncoderclasse que possui um defaultmétodo personalizado , mas nem sei por onde começar a conversão pelo set. Devo criar um dicionário com os setvalores dentro do método padrão e depois retornar a codificação? Idealmente, gostaria de tornar o método padrão capaz de lidar com todos os tipos de dados que o codificador original usa (estou usando o Mongo como fonte de dados, para que as datas também pareçam causar esse erro)
Qualquer dica na direção certa seria apreciada.
EDITAR:
Obrigado pela resposta! Talvez eu devesse ter sido mais preciso.
Utilizei (e votei) as respostas aqui para contornar as limitações da settradução, mas há chaves internas que também são um problema.
Os objetos no setsão objetos complexos aos quais se traduzem __dict__, mas eles também podem conter valores para suas propriedades que podem ser inelegíveis para os tipos básicos no codificador json.
Existem muitos tipos diferentes para isso set, e o hash calcula basicamente um ID exclusivo para a entidade, mas no verdadeiro espírito do NoSQL não há como dizer exatamente o que o objeto filho contém.
Um objeto pode conter um valor de data para starts, enquanto outro pode ter outro esquema que não inclui chaves que contenham objetos "não primitivos".
É por isso que a única solução em que consegui pensar foi estender o método JSONEncoderpara substituir o defaultmétodo para ativar casos diferentes - mas não sei ao certo como proceder e a documentação é ambígua. Em objetos aninhados, o valor retornado de defaultpassa por chave ou é apenas uma inclusão / descarte genérica que examina o objeto inteiro? Como esse método acomoda valores aninhados? Examinei as perguntas anteriores e não consigo encontrar a melhor abordagem para a codificação específica de caso (que infelizmente parece ser o que vou precisar fazer aqui).
dicts? Eu acho que você quer fazer apenas umlistfora do set e, em seguida, passá-lo para o codificador ... por exemplo:encode(list(myset))