JSON to C#
Gere records C# com atributos JsonPropertyName a partir de uma amostra JSON, para System.Text.Json.
Entrada JSON
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#
- Cole uma resposta JSON representativa no painel esquerdo — as propriedades geradas correspondem exatamente às chaves presentes naquela amostra.
- 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.
- Copie os records para o seu projeto e desserialize com JsonSerializer.Deserialize<Root>(json).
- 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.