Eu tenho um Python set
que 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 set
para o json.dumps
mé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.JSONEncoder
classe que possui um default
método personalizado , mas nem sei por onde começar a conversão pelo set
. Devo criar um dicionário com os set
valores 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 set
tradução, mas há chaves internas que também são um problema.
Os objetos no set
sã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 JSONEncoder
para substituir o default
mé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 default
passa 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).
dict
s? Eu acho que você quer fazer apenas umlist
fora do set e, em seguida, passá-lo para o codificador ... por exemplo:encode(list(myset))