[resolvido] Serializando uma data (datetime) com Python.

Então você tenta converter um dicionário em json, esquece que tem um objeto la que é do tipo datetime e acaba recebendo um Exception do tipo TypeError com a mensagem “Object of type datetime is not JSON serializable”. Neste post mostro uma forma de resolver isso.

Vamos considerar o cenário abaixo:

Neste código, tento criar uma variável chamada foo, contendo a versão string de um dicionário simples, que possui apenas uma chave (dt) com o valor do dia/hora atual (datetime.now()).

A função dumps do json serve para fazer esta conversão, mas alguns objetos ela não consegue converter com o funcionamento padrão. Sendo assim, o código acima resultaria no erro:

 

A primeira forma de resolver este problema seria tratando os objetos datetime antes de fazer a conversão, mas talvez fazer isso seja muito trabalhoso. Podemos contornar o problema criando um conversor padrão e utilizando ele na função dumps.

Primeiro, vamos ao conversor:

O que a função acima faz?

  1. Confere se o objeto que foi passado para a função é do tipo datetime;
  2. Se for chama a função isoformat() deste objeto, que retorna a versão em string do objeto;

 

Simples assim. O próximo passo é utilizar este conversor na função dumps.

 

No código acima também faço uma chamada para a função dumps, mas desta vez inclui um novo argumento, o default. Ele serve como opção para utilizar quando um objeto não for serializavel da forma padrão. Exemplificando: Imagine um dicionario que possui três chaves: uma string, um integer e um valor datetime. Quando você utilizar a função json.dumps, ele vai conseguir converter a string e o integer, mas não sabe como converter o objeto datetime. Então a função vai recorrer ao que você informar no argumento default.

Por isso que nesta segunda tentativa, consegui converter o dicionario para string.

Se quiser, criei um exemplo para este post no meu Github.

 

Espero ter ajudado!

The following two tabs change content below.
Breno RdV
Ex-Psicólogo, com quase uma década de experiência em Recursos Humanos e Gestão de Pessoas, atual desenvolvedor e Analista de Sistemas, trabalhando com PowerBuilder, C#, PowerShell e expandindo horizontes para Python, Xamarin, PHP, Angular e (por que não?) Unity.

Comments

comments

Posted in Dev, Python and tagged , , , , .