Skip to content
jsonforge.app

JSON to C#

Gere records C# com atributos JsonPropertyName a partir de uma amostra JSON, para System.Text.Json.

Entrada JSON

Loading editor…

Código gerado

Digite JSON à esquerda para gerar um tipo a partir dele.

O que é JSON to C#?

Um conversor de JSON para C# transforma uma amostra de payload JSON em declarações de record C# prontas para desserializar com System.Text.Json, o serializador embutido no .NET moderno. Records com propriedades init-only são a forma idiomática atual de modelar uma resposta de API: o objeto é imutável depois de construído, a igualdade por valor vem de graça e o serializador pode populá-lo diretamente. A saída gerada também carrega um atributo [JsonPropertyName] em cada propriedade, e é isso que torna o mapeamento confiável — a convenção do C# capitaliza nomes de propriedades enquanto as chaves JSON tipicamente são camelCase ou snake_case, e depender da política de nomes do serializador para atravessar essa distância é uma fonte frequente de propriedades que desserializam silenciosamente como null. Todo nome de propriedade é convertido para PascalCase independentemente da capitalização da chave de origem — camelCase, snake_case ou kebab-case tornam-se todos a mesma forma PascalCase que a linguagem espera — enquanto a chave original do payload sobrevive apenas no atributo. Um número JSON com ponto decimal é tipado como `double`, acompanhando como o próprio System.Text.Json trata um número JSON sem tipo, em vez de `float` ou `decimal`.

Como usar JSON to C#

  1. Cole uma resposta JSON representativa no painel esquerdo — as propriedades geradas correspondem exatamente às chaves presentes naquela amostra.
  2. Defina um nome de record raiz acima da saída (o padrão é "Root"); cada objeto aninhado se torna seu próprio record, nomeado pela chave que o contém.
  3. Copie os records para o seu projeto e desserialize com JsonSerializer.Deserialize<Root>(json).
  4. Use o seletor de linguagem acima da saída para emitir a mesma forma como um record Java ou uma data class Kotlin.

Exemplos

Objeto plano com atributos JsonPropertyName

Entrada

{"id": 1, "name": "Ada"}

Saída

using System.Text.Json.Serialization; public record Root { [JsonPropertyName("id")] public int Id { get; init; } [JsonPropertyName("name")] public string Name { get; init; } }

Objeto aninhado se torna seu próprio record

Entrada

{"user": {"id": 1, "roles": ["admin"]}}

Saída

using System.Text.Json.Serialization; using System.Collections.Generic; public record User { [JsonPropertyName("id")] public int Id { get; init; } [JsonPropertyName("roles")] public List<string> Roles { get; init; } } public record Root { [JsonPropertyName("user")] public User User { get; init; } }

Valor decimal se torna double

Entrada

{"id": 1, "price": 9.99}

Saída

using System.Text.Json.Serialization; public record Root { [JsonPropertyName("id")] public int Id { get; init; } [JsonPropertyName("price")] public double Price { get; init; } }

Erros comuns

  • Renomear uma propriedade C# sem atualizar seu [JsonPropertyName] — o serializador então não encontra chave correspondente e deixa a propriedade no valor padrão, sem exceção que aponte a causa.
  • Assumir que uma política de nomes camelCase cobre o payload inteiro, o que quebra no momento em que uma chave usa convenção diferente e produz nulls que parecem um problema de API em vez de um problema de mapeamento.
  • Deixar nullable reference types ativados em campos que a API pode omitir, o que gera avisos do compilador ou um null numa propriedade cujo tipo afirma não poder ser null.
  • Deixar um campo monetário tipado como o double gerado — troque por decimal manualmente quando a precisão importa, já que o gerador não tem como saber que um número representa moeda.
  • Esperar que uma chave snake_case ou kebab-case sobreviva como nome da propriedade C# — toda propriedade é convertida para PascalCase para você, e a chave original só sobrevive dentro do atributo [JsonPropertyName].

Por que usar esta ferramenta

  • Emite atributos [JsonPropertyName] explícitos, evitando as divergências de política de nomes que anulam propriedades silenciosamente.
  • Adiciona as diretrizes using necessárias, incluindo System.Collections.Generic quando o payload contém arrays.
  • Roda inteiramente no cliente — uma resposta de API de produção colada como amostra para gerar records nunca chega a um servidor.
  • Converte todo nome de propriedade para PascalCase automaticamente, independentemente da capitalização da chave de origem, mantendo a chave original intacta via [JsonPropertyName] para o serializador.
  • Infer int versus double por valor a partir da amostra, em vez de padronizar todo número JSON num único tipo numérico impreciso.

Perguntas frequentes