Serialização JSON com System.Text.Json \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 15 Horas 

 50 Min 

 08 Seg 

   Tempo restante da oferta: 15 50 08 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Serialização JSON com System.Text.Json  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) [ .NET Core ](https://www.treinaweb.com.br/blog/categoria/net-core) 

# Serialização JSON com System.Text.Json

 Veja como serializar e desserializar JSON no .NET com a biblioteca System.Text.Json.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/12/serializacao-json-com-system-text-json.png)  

A comunicação entre sistemas é algo recorrente no dia a dia do desenvolvedor. Seja a comunicação com um sistema de terceiro, ou mesmo um sistema interno. Entretanto, atualmente o mais comum é a comunicação entre a aplicação e uma [API](https://www.treinaweb.com.br/blog/o-que-e-uma-api/). E nestas situações, geralmente isso ocorre via [JSON](https://www.treinaweb.com.br/blog/o-que-e-json/).

Existem algumas bibliotecas para se trabalhar com JSON no .NET, sendo que as que mais se destacam são [Newtonsoft.Json](https://www.newtonsoft.com/json) e [System.Text.Json](https://docs.microsoft.com/pt-br/dotnet/api/system.text.json?view=net-5.0). Neste artigo iremos ver a segunda.

[  ![ASP.NET Core  - Desenvolvimento de APIs REST](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/aspnet-core.svg)   Curso ASP.NET Core - Desenvolvimento de APIs REST Conhecer o curso ](https://www.treinaweb.com.br/curso/aspnet-core-desenvolvimento-de-apis-rest)

## Tudo começou no .NET Core 2.1

Conforme o ecossistema do [.NET Core](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end/net-core/) foi crescendo, o processamento de dados em JSON se tornou uma parte essencial das aplicações da plataforma, principalmente as voltadas para web, como [ASP.NET Core](https://www.treinaweb.com.br/blog/o-que-e-o-asp-net-core/) e [SignalR](https://www.treinaweb.com.br/blog/aplicacoes-em-tempo-real-com-asp-net-core-signalr/). Mesmo que fornecesse alguns recursos para trabalhar com JSON, era quase unanime o uso da biblioteca `Newtonsoft.Json` para este serviço.

Assim, no .NET Core 2.1 esta biblioteca foi integrada a plataforma e se tornou uma dependência padrão de alguns projetos, como o ASP.NET Core. Algo que foi bem aceito, mesmo que em alguns cenários isso gerasse conflitos e/ou limitações (e.g. não era possível utilizar uma versão da biblioteca não suportada pelo ASP.NET Core 2.1).

Sempre visando melhorar a performance da plataforma, durante o desenvolvimento da versão 3, a equipe da Microsoft notou que a biblioteca `Newtonsoft.Json` poderia ser um limitador para o processamento de JSON. Não que esta biblioteca não seja performática, mas as suas limitações poderiam ser um gargalo para este aspecto do .NET Core.

A equipe pensou em atualizá-la, mas isso iria “quebrar” as antigas versões da mesma, além de outras bibliotecas que dependem dela. Desta forma, no .NET Core 3.0 foi introduzido uma nova biblioteca JSON, a `System.Text.Json`.

Visando alta performance, esta biblioteca não é equivalente a `Newtonsoft.Json`, então não dá para substituir uma pela outra. Em alguns casos, o uso da primeira ainda é recomendado e em caso de dúvidas, a Microsoft fornece uma [tabela comparando os recursos de cada uma](https://docs.microsoft.com/pt-br/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to#table-of-differences-between-no-locnewtonsoftjson-and-no-locsystemtextjson).

## Serialização e Deserialização com System.Text.Json

A biblioteca `System.Text.Json` fornece três formas de se trabalhar com JSON:

- **JsonSerializer**: API de uso geral, utilizada para serializar e desserializar JSON em objetos POCO;
- **JsonDocument**: API mais avançada, que permite que o JSON seja quebrado e se torne “navegável”;
- **Utf8JsonReader**: API que dá controle total sobre o JSON e permite que o desenvolvedor decida como cada token deve ser tratado.

O uso de cada uma irá depender do objetivo, entretanto, por ser bem mais avançada, neste artigo não iremos abordar o `Utf8JsonReader`. Veremos às demais a seguir.

### JsonSerializer

É bem comum necessitar desserializar um JSON em um objeto. Caso este JSON não tenha nenhuma particularidade, isso pode ser feito de forma simples com o método `Deserialize`:

```csharp
using System;
using System.Text.Json;

var json = @"{""Nome"":""Carlos Silva"",""Idade"":33}";

var pessoa = JsonSerializer.Deserialize(json);
Console.WriteLine(pessoa.Nome);
Console.WriteLine(pessoa.Idade);

public class Pessoa
{
    public String Nome { get; set; }
    public int Idade { get; set; }
}

```

Se o JSON definir algo fora do padrão, como um valor numérico como string:

```csharp
var json = @"{""Nome"":""Carlos Silva"",""Idade"": ""33""}";

```

Pode ser utilizado o `JsonSerializerOptions` para indicar que este valor deve ser contido para numérico:

```csharp
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

var options = new JsonSerializerOptions
{
    NumberHandling = JsonNumberHandling.AllowReadingFromString
};

var json = @"{""Nome"":""Carlos Silva"",""Idade"": ""33""}";

var pessoa = JsonSerializer.Deserialize(json, options);
Console.WriteLine(pessoa.Nome);
Console.WriteLine(pessoa.Idade);

public class Pessoa
{
    public String Nome { get; set; }
    public int Idade { get; set; }
}

```

Se o processo for o inverso, converter um objeto para JSON, pode ser utilizado o método `Serialize`:

```csharp
using System;
using System.Text.Json;

var pessoa = new Pessoa { Nome = "Carlos Silva", Idade = 33 };

var json = JsonSerializer.Serialize(pessoa);
Console.WriteLine(json); // {"Nome":"Carlos Silva","Idade":33}

public class Pessoa
{
    public String Nome { get; set; }
    public int Idade { get; set; }
}

```

Este método também aceita opções:

```csharp
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

var options = new JsonSerializerOptions
{
    //Lê valores numéricos definidos como string e escreve valores numéricos como strings
    NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString,
    //Identa o JSON gerado
    WriteIndented = true,
    //Ignora propriedades com valor nulo ou padrão
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
};

var pessoa = new Pessoa { Nome = "Carlos Silva", Idade = 33 };

var json = JsonSerializer.Serialize(pessoa, options);
Console.WriteLine(json);
// {
//   "Nome": "Carlos Silva",
//   "Idade": "33"
// }

public class Pessoa
{
    public String Nome { get; set; }
    public int Idade { get; set; }
    public List Telefones { get; set; }
}

```

### JsonDocument

O `JsonDocument` deve ser utilizado para situações onde se possui o JSON, mas não se deseja que seja desserializado para um objeto POCO. Por exemplo, se a intenção for acessar algum elemento dele:

```csharp
using System;
using System.Text.Json;

var json = @"{""Nome"":""Carlos Silva"",""Idade"":33, ""Telefones"": { ""celular"": ""11-99999-9999"", ""comercial"": ""11-4444-4444""}}";

var obj = JsonDocument.Parse(json);
var nome = obj.RootElement.GetProperty("Nome").GetString();
var celular = obj.RootElement.GetProperty("Telefones").GetProperty("celular").ToString();
Console.WriteLine(nome);//Carlos Silva
Console.WriteLine(celular);//11-99999-9999

```

Quando se sabe a localização deste elemento, o seu acesso será simples. Entretanto, e se for necessário pesquisar o elemento dentro do JSON? Para estas situações pode ser utilizado os métodos `EnumerateObject` e/ou `EnumerateArray`, que permitem percorrer o JSON:

```csharp
using System;
using System.Linq;
// using System.Collections.Generic;
using System.Text.Json;
// using System.Text.Json.Serialization;

var json = @"{""Nome"":""Carlos Silva"",""Idade"":33, ""Telefones"": { ""celular"": ""11-99999-9999"", ""comercial"": ""11-4444-4444""}}";

var obj = JsonDocument.Parse(json);
var telefones = obj.RootElement.EnumerateObject()
                   .Where(jsonProperty => jsonProperty.Name.Contains("Telefones") 
						            && jsonProperty.Value.ValueKind == JsonValueKind.Object)
                   .Select(jsonProperty => jsonProperty.Value.GetProperty("comercial"));
foreach(var telefone in telefones)
    Console.WriteLine(telefone);//11-4444-4444

```

Serialização e desserialização são operações “caras”, que o `JsonDocument` procura diminuir mantendo a alocação de memória ao mínimo. Desta forma, ele deve ser utilizado, principalmente quando o JSON for muito complexo para uma classe POCO, for necessário acessar apenas algumas partes dele e/ou não se saiba o formato dos seus dados.

[  ![C# - Algoritmos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/c-sharp.svg)   Curso C# - Algoritmos Conhecer o curso ](https://www.treinaweb.com.br/curso/c-sharp-algoritmos)

## Finalizando

Deste que foi lançada a `System.Text.Json` vem recebendo recursos e melhorias. Ainda não é uma biblioteca substituta para a `Newtonsoft.Json` (algo que não é a intenção, então não deve ocorrer). Mas devido a sua performance, sempre que ela atender as suas necessidades, opte pelo seu uso.

Então fico por aqui. Até à próxima.

- [ #C# ](https://www.treinaweb.com.br/blog/tag/csharp)
- [ #JSON ](https://www.treinaweb.com.br/blog/tag/json)
- [ #.NET Core ](https://www.treinaweb.com.br/blog/tag/net-core)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/11/06103205/orm-lite-400x280.jpg)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Utilizando o Micro ORM ServiceStack.OrmLite em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-o-micro-orm-servicestack-ormlite-em-uma-aplicacao-asp-net-core) 

     Aprenda na prática como fazer uso do micro framework ORM ServiceStack.OrmLite em uma aplicação ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/15141252/JSON-LARAVEL-2-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Conhecendo os recursos de serialização JSON do Laravel ](https://www.treinaweb.com.br/blog/conhecendo-os-recursos-de-serializacao-json-do-laravel) 

     Nesse artigo falaremos um pouco sobre o que é serialização de dados e quais os principais recursos que o Laravel/Eloquent possuem para nos ajudar na serialização JSON, um dos formatos mais usados em APIs.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/03/26181326/CAPA-ELTON-MARÇO-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Como melhorar o retorno das suas APIs no Laravel com API Resource do Eloquent ](https://www.treinaweb.com.br/blog/como-melhorar-o-retorno-das-suas-apis-no-laravel-com-api-resource-do-eloquent) 

     Um dos pontos mais importantes quando estamos trabalhando APIs é o retorno dos dados. Veja como melhorar suas APIs no Laravel usando o API Resouce do Eloquent.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/03101729/xml-vs-json-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ JSON vs XML ](https://www.treinaweb.com.br/blog/json-vs-xml) 

     Agora que já sabemos o que é o XML e o JSON, qual escolher? É o que veremos neste artigo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/22100127/o-que-é-json-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ O que é JSON? ](https://www.treinaweb.com.br/blog/o-que-e-json) 

     Veja neste artigo o que é JSON.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/02/17112617/YAML-400x280.png)  [ Tecnologia ](https://www.treinaweb.com.br/blog/categoria/tecnologia) 

     7 anos atrás

    ##  [ O que é YAML? ](https://www.treinaweb.com.br/blog/o-que-e-yaml) 

     Veja neste artigo o que é e para que serve o YAML.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/PUB-DEV-400x280.jpg)  [ Flutter ](https://www.treinaweb.com.br/blog/categoria/flutter) 

     4 anos atrás

    ##  [ Gerenciador de pacotes Dart e Flutter ](https://www.treinaweb.com.br/blog/gerenciador-de-pacotes-dart-e-flutter) 

     Saiba o que é o gerenciador de pacotes Dart e Flutter, como utilizar um pacote, biblioteca instalada por ele e sobre o pubspec.yaml.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Guia do framework NestJS ](https://www.treinaweb.com.br/blog/guia-do-framework-nestjs) 

     Neste guia do framework NestJS vamos fazer um compilado de tópicos úteis sobre o framework, desde criar um projeto básico até autenticação.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/07/CRIANDO-PRIMEIRO-CRUD-COM-NESTJS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Criando o primeiro CRUD com NestJS ](https://www.treinaweb.com.br/blog/criando-o-primeiro-crud-com-nestjs) 

     Neste artigo veremos como criar um CRUD com NestJS, o passo a passo utilizando ferramentas como o TypeORM e o banco de dados SQLite.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/08/NEST-JS-CLASS-VALIDATOR-CLASS-TRANSFORMER-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Validação e Serialização no NestJS: class-validator e class-transformer ](https://www.treinaweb.com.br/blog/validacao-e-serializacao-no-nestjs-class-validator-e-class-transformer) 

     Vamos abordar a utilização de duas biblitecas de serialização e validação fundamentais no NestJS: class-validator e class-transformer

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Guias ](https://www.treinaweb.com.br/blog/categoria/guias) 

     3 anos atrás

    ##  [ Guia da linguagem Go ](https://www.treinaweb.com.br/blog/guia-da-linguagem-go) 

     Nesse guia de Go você aprenderá o necessário para criar os seus primeiros softwares com a linguagem de programação Go. Acesse agora mesmo!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ O que é e como começar com Go (Golang)? ](https://www.treinaweb.com.br/blog/o-que-e-e-como-comecar-com-golang) 

     Neste artigo vamos ter o contato inicial com a linguagem Go (Golag) e aprender um pouco sobre as suas características e como funciona a sua sintaxe.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **15h 50min 08s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
