Trabalhando com Json e .NET Core 3.0 — Parte 1
Uma das novidades do .NET Core 3.0 é o suporte nativo a JSON, trazendo um ferramental otimizado para trabalhar com JSONs e que faz muita diferença em alguns cenários em termos de alocação de memória e consumo de recursos, chegando a possibilitar até 2x mais requisições em nossas API`s (em uma comparação com o Json.NET).
Pensando que JSON é um dos formatos mais utilizados atualmente em comunicações entre nossos sistemas, aplicativos e devices. Quis abordar um pouco esta nova biblioteca e como podemos explorar suas features e benefícios.
Como podemos começar?
Vou criar um Console com .NET Core 3.0 e nele vou usar duas namespaces:
Além disso criarei duas classes para utilizarmos: Order e Product
Serializando um objeto
Para serializar um objeto em string podemos utilizar o JsonSerializer.Serialize:
O que irá produzir uma string mais ou menos assim:
Notem que as minhas variáveis ficaram com Pascal Case, como padrão eu prefiro manter elas em Camel Case. Para configurar isto é possível passar um parâmetro para o nosso serializador com várias configurações, uma delas é a Policy de convenção de nome:
Que irá produzir a string final da seguinte maneira:
Outra opção que temos neste sentido é criar a nossa própria implementação para a Policy de tipos, no exemplo abaixo crio uma classe que herda de JsonNamingPolicy e implementa o padrão Snake Case (ex: NomeDoAluno => nome_do_aluno):
Tendo a nova classe criada, podemos configurar a serialização utilizando ela, notem como ficou a propriedade DataCreated => data_created:
Além destas opções é possível configurar outras como indentação do JSON, se o serializador deverá ignorar valores nulos, quantos níveis entre os objetos ele irá navegar e opções que possibilitam ele ignorar propriedades ready only:
Deserializando
A deserialização também ocorre de maneira parecida, nela também podemos utilizar as opções que temos no JsonSerializeOptions (no exemplo abaixo utilizei o SnakeCasePropertyNamingPolicy que criei)
Outra opção útil é chamada de AllowTrailingCommas, que permite deserializar com sucesso um JSON que possua um objeto que termine com uma vírgula no final da última propriedade, por exemplo:
Deserializando o JSON acima com a opção AllowTrailingCommas=true nós conseguiremos ter sucesso:
Porem por padrão esta opção é configurada como false, notem como fica a deserialização do mesmo objeto com a opção como false:
Posso migrar 100% minhas aplicações?
Sem dúvida na maioria dos cenários teremos sucesso no uso, porém, ainda existem alguns cenários que precisaremos optar por outra biblioteca (como por exemplo o Json.Net). Minha sugestão é sempre que possível avalie e teste, temos alguns restrições em propriedades (sem o get e o set) e em tuplas que não funcionam muito bem ainda. Mesmo com estas limitações, o ganho de performance vale muito o teste.
E minha API?
No .NET Core 3.0 por padrão nossos projetos web já utilizam o System.Text.Json. No próximo post vou abordar um de uma maneira detalhada de como e quando optar por utilizar o Json.NET ou a nova biblioteca em nossos projetos de API`s e Web Sites.
Os exemplos estão disponíveis em meu github: https://github.com/rodolfofadino/example_post_1_system_text_json
Espero que este post seja útil, estou a disposição para dúvida, críticas e sugestões 😀
abs
Rodolfo