JSON em C# dynamic em 2025: desserialização sem dor

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

JSON e C# dynamic: por que isso ainda é uma dor (e como tratá-la)

\n\n

Você já olhou para uma resposta JSON de uma API e pensou: "Meu Deus, por que você é tão complexo?" Especialmente se a estrutura de dados muda toda vez, como o tempo em São Petersburgo. Um exemplo clássico é a resposta de um serviço externo, onde os campos podem ser strings, arrays ou até mesmo null. Ou quando você precisa analisar rapidamente um JSON, mas criar uma classe separada para ele é como usar um microscópio para cortar um microchip.

\n\n

É exatamente para esses casos que existe a mágica do dynamic em C#. A pergunta "Deserialize JSON into C# dynamic object?" no Stack Overflow acumulou milhares de visualizações — e não é por acaso. Em 2025, quando microsserviços e APIs dinâmicas se tornaram a norma, a capacidade de trabalhar com JSON de forma rápida e flexível é um superpoder do desenvolvedor.

\n\n

Neste artigo, vamos abordar as melhores práticas de desserialização de JSON em dynamic object em C#. Sem teoria chata, apenas código, exemplos e dicas reais. Vamos nessa!

\n\n

Por que dynamic? E não apenas JObject?

\n\n

Boa pergunta. Em C#, existem JObject (do Newtonsoft.Json) e JsonDocument (do System.Text.Json). Eles também conseguem analisar JSON "em tempo real". Mas o dynamic oferece uma coisa importante: açúcar sintático.

\n\n

Compare:

\n\n
// Via JObject\nvar json = JObject.Parse(rawJson);\nvar name = (string)json["user"]["name"];\n\n// Via dynamic\ndynamic obj = JsonConvert.DeserializeObject<dynamic>(rawJson);\nvar name = obj.user.name;\n
\n\n

A segunda opção é lida como código comum, e não como "pegue a chave, converta o tipo, verifique se é nulo". Isso é especialmente útil quando o JSON é profundamente aninhado.

\n\n

Método 1: Clássico — Newtonsoft.Json (Json.NET)

\n\n

Sim, estamos em 2025, mas o Newtonsoft.Json ainda está vivo e saudável. Muitos projetos legados, e até mesmo alguns modernos, ainda o utilizam. Por quê? Flexibilidade, extensibilidade e um milhão de configurações.

\n\n

Exemplo básico

\n\n
using Newtonsoft.Json;\n\nstring json = @"\n{\n    'name': 'Alexey',\n    'age': 30,\n    'skills': ['C#', 'Python', 'SQL'],\n    'address': {\n        'city': 'Moscou',\n        'zip': 101000\n    }\n}";\n\ndynamic obj = JsonConvert.DeserializeObject<dynamic>(json);\n\nConsole.WriteLine(obj.name);        // Alexey\nConsole.WriteLine(obj.age);         // 30\nConsole.WriteLine(obj.skills[0]);   // C#\nConsole.WriteLine(obj.address.city); // Moscou\n
\n\n

Tudo simples e elegante. Mas há um detalhe: ao trabalhar com dynamic, você perde o IntelliSense e a verificação de tipos em tempo de compilação. Um erro no nome do campo só aparecerá em tempo de execução. Portanto:

\n\n
    \n
  • Use dynamic apenas para ler dados que você não controla.
  • \n
  • Sempre envolva as chamadas em try-catch.
  • \n
  • Não abuse — se a estrutura do JSON for estável, é melhor criar uma classe DTO.
  • \n
\n\n

Método 2: Moderno — System.Text.Json

\n\n

A partir do .NET Core 3.0, a Microsoft promove o System.Text.Json — rápido, nativo, sem dependências externas. Em 2025, é o padrão para novos projetos.

\n\n

Mas há um problema: o System.Text.Json não consegue desserializar para dynamic "pronto para uso". Será preciso um pouco de criatividade.

\n\n

Opção A: Via JsonDocument e ExpandoObject

\n\n
using System.Text.Json;\nusing System.Dynamic;\n\nstring json = @"{""name"":""Elena"",""age"":25,""active"":true}";\n\nusing JsonDocument doc = JsonDocument.Parse(json);\ndynamic obj = ConvertToExpando(doc.RootElement);\n\nConsole.WriteLine(obj.name);   // Elena\nConsole.WriteLine(obj.age);    // 25\nConsole.WriteLine(obj.active); // True\n\nstatic ExpandoObject ConvertToExpando(JsonElement element)\n{\n    var expando = new ExpandoObject();\n    var dict = (IDictionary<string, object>)expando;\n\n    foreach (var property in element.Enumera                

Blogs

Book Recommendations