Introdução ao trabalho com JSON em C#
\n\nJSON (JavaScript Object Notation) é um formato leve de troca de dados, amplamente utilizado em desenvolvimento web, aplicativos móveis e microsserviços. Para um desenvolvedor C#, saber trabalhar com JSON é uma habilidade obrigatória. Neste artigo, abordaremos os fundamentos do parsing (desserialização) e da serialização de JSON usando o namespace moderno System.Text.Json, que faz parte do .NET Core 3.0 e superiores, bem como .NET 5/6/7/8.
Veremos:
\n- \n
- O que são serialização e desserialização \n
- Como converter um objeto C# em uma string JSON \n
- Como ler JSON e transformá-lo de volta em um objeto \n
- Trabalho com objetos aninhados e coleções \n
- Tratamento de erros e configuração da serialização \n
Todos os exemplos de código foram escritos para um aplicativo de console C# (.NET 6+). Você pode copiá-los e executá-los imediatamente.
\n\n1. Fundamentos da serialização: objeto → JSON
\n\nSerialização é o processo de converter um objeto (ou estrutura de dados) em uma string no formato JSON. Em C#, usamos a classe JsonSerializer do namespace System.Text.Json.
Criando um modelo simples
\n\nSuponha que temos a classe Person:
public class Person\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public string Email { get; set; }\n}\n\nSerialização de um objeto
\n\nAgora, vamos criar uma instância e convertê-la em JSON:
\n\nusing System.Text.Json;\n\nPerson person = new Person\n{\n Name = "Ivan Petrov",\n Age = 30,\n Email = "ivan@example.com"\n};\n\nstring jsonString = JsonSerializer.Serialize(person);\nConsole.WriteLine(jsonString);\n\nResultado:
\n\n{"Name":"Ivan Petrov","Age":30,"Email":"ivan@example.com"}\n\nPor padrão, o JsonSerializer usa camelCase para nomes de propriedades (primeira letra minúscula), mas em nosso exemplo os nomes permaneceram com letra maiúscula, pois não alteramos as configurações. Se você precisar de camelCase estrito, use JsonSerializerOptions:
var options = new JsonSerializerOptions\n{\n PropertyNamingPolicy = JsonNamingPolicy.CamelCase\n};\nstring jsonCamelCase = JsonSerializer.Serialize(person, options);\nConsole.WriteLine(jsonCamelCase);\n// {"name":"Ivan Petrov","age":30,"email":"ivan@example.com"}\n\n2. Desserialização: JSON → objeto
\n\nDesserialização é o processo inverso: pegamos uma string JSON e a transformamos em um objeto C#.
\n\nExemplo simples de desserialização
\n\nSuponha que recebemos um JSON de uma API:
\n\nstring jsonFromApi = @"{""Name"":""Anna Smirnova"",""Age"":25,""Email"":""anna@test.com""}";\n\nPerson? personFromJson = JsonSerializer.Deserialize<Person>(jsonFromApi);\n\nif (personFromJson != null)\n{\n Console.WriteLine($"Nome: {personFromJson.Name}, Idade: {personFromJson.Age}");\n}\n\nObserve o sinal ? após o tipo Person — é uma anotação nullable, indicando que o resultado pode ser null (por exemplo, se o JSON for inválido).
Trabalhando com arrays e listas
\n\nFrequentemente, o JSON contém coleções de objetos. Suponha que temos um array de usuários:
\n\nstring jsonArray = @"\n[\n {""Name"":""Oleg"",""Age"":35},\n {""Name"":""Maria"",""Age"":28},\n {""Name"":""Dmitri"",""Age"":42}\n]";\n\nList<Person>? people = JsonSerializer.Deserialize<List<Person>>(jsonArray);\n\nif (people != null)\n{\n foreach (var p in people)\n {\n Console.WriteLine($"{p.Name} - {p.Age} anos");\n }\n}\n\n3. Trabalhando com objetos aninhados e estruturas complexas
\n\nDados JSON reais raramente são planos. Vamos considerar