Saltar para o conteúdo
4all.tools

Gere modelos C# a partir de exemplos JSON completos

Infira classes C# localmente com chaves JSON exatas, presença com JsonRequired e capacidades explícitas de nullable e números raw.

Espaço de trabalho da ferramenta

JSON para C#

C# 12 / .NET 8; apenas System.Text.Json e biblioteca padrão.

JsonRequired exige presença, não referências não null. Propriedades opcionais nullable, incluindo JsonElement?, reduzem ausência e null ao mesmo valor. Lexemas inteiros em int64 sem zero negativo usam long; demais números usam JsonElement. Helpers raiz desserializam sem validar o contrato inferido. Valores com substitutos isolados mantêm um aviso do parser, mas System.Text.Json os rejeita em execução.

Ative JavaScript para gerar código. Você pode ler e editar o JSON.

Todos os elementos e documentos contribuem para o mesmo contrato. Um array na raiz continua sendo um array. Ausência de campo é diferente de null.

Até 20 documentos, 1.000.000 de unidades UTF-16 de entrada e 2.000.000 de saída; outros limites de recursos também se aplicam.

Seu JSON é processado localmente em um Worker do navegador. Não é enviado nem armazenado.

Use entre 1 e 64 letras e dígitos ASCII, começando por uma letra. Nomes reservados são rejeitados.

Pronto para inserir JSON.

    Exemplos completos e arrays raiz

    Cole JSON estrito ou escolha um arquivo UTF-8 local. Gere a partir de um documento ou até vinte exemplos completos. Todos os elementos e campos tardios contribuem; um array raiz permanece array. Entradas vazias, chaves decodificadas duplicadas, comentários, vírgulas finais e documentos concatenados interrompem a geração preservando os exemplos.

    O editor mostra o exemplo ativo e o total. Após gerar, confira o nome do arquivo, a expressão do tipo raiz, a quantidade de nós JSON e o tamanho do código completo. Esses dados descrevem o resultado atual; copiar e baixar incluem todo o arquivo mesmo quando a prévia está limitada.

    [{"id":1},{"id":2,"nombre":"Ana"}]
    #nullable enable
    namespace Generated;
    
    public sealed class RootItem
    {
      [global::System.Text.Json.Serialization.JsonRequired]
      [global::System.Text.Json.Serialization.JsonPropertyName("id")]
      public long Id { get; set; }
      [global::System.Text.Json.Serialization.JsonPropertyName("nombre")]
      public string? Nombre { get; set; }
    }
    
    public static class Root
    {
      public static global::System.Collections.Generic.List<RootItem> Deserialize(string json)
        => global::System.Text.Json.JsonSerializer.Deserialize<global::System.Collections.Generic.List<RootItem>>(json)!;
    }

    Atributos exatos, presença obrigatória e capacidades nullable

    Cada propriedade recebe JsonPropertyName com a chave exata, mesmo quando coincide com o membro PascalCase. Aspas, backslash, controles, emoji, NFC e NFD permanecem distintos. Apenas identificadores mudam em colisões, nomes da classe ou membros herdados como Equals e GetType. Substitutos isolados em chaves interrompem a geração. A saída usa classes public sealed no namespace Generated, propriedades públicas get/set e tipos padrão globalmente qualificados, sem namespace configurável, records, pacotes ou converters próprios.

    JsonRequired exige presença; omitir uma propriedade obrigatória provoca JsonException. Opcionais não recebem JsonRequired e usam T? ou JsonElement? para raw. Ausência e null explícito podem tornar-se null, inclusive em raw opcional; um aviso explica essa perda de distinção. Null-only obrigatório usa JsonElement com ValueKind Null. Referências obrigatórias não nullable inicializam com default! para análise estática, sem adicionar um valor de dados válido. As anotações nullable do .NET 8 não rejeitam null explícito em referências obrigatórias; um aviso global explica isso. WhenWritingNull não é ativado e nenhum round-trip que preserve presença é prometido.

    Números e exportação local completa

    Lexemas inteiros puros dentro de int64 e sem zero negativo usam long, incluindo 9007199254740993 e os extremos int64. Decimais, expoentes, -0 e inteiros fora de int64 usam JsonElement com aviso de número raw; GetRawText preserva o lexema. Avisos de precisão do parser continuam visíveis. Unknown, somente null e uniões com várias variantes não null usam JsonElement com avisos; objetos vazios usam Dictionary<string, JsonElement>. A raiz objeto não vazia é uma classe direta; demais raízes têm helper público static Deserialize(string json), incluindo listas, primitivas e objeto/null. O helper delega a System.Text.Json sem validar o contrato inferido. Um substituto isolado em valor string permite gerar o tipo, mas o consumidor .NET 8 rejeita esse valor; o aviso do parser permanece visível.

    Limites: 20 amostras, 1.000.000 unidades UTF-16 de entrada, 4.000.000 bytes UTF-8 agregados e por arquivo, profundidade 200, 100.000 nós/visitas de inferência, 1.000.000 unidades de parsing, 10.000 tipos, 20.000 campos, 2.000.000 unidades de fusão, 2.000 declarações, 4.000.000 unidades de emissão e 15 segundos. Saída: 2.000.000 unidades UTF-16 e 8.000.000 bytes. Os máximos não podem necessariamente ser atingidos juntos; ultrapassar um limite não produz código parcial.

    A prévia contém até 20.000 unidades UTF-16; copiar e baixar incluem todo Types.cs atual como text/plain;charset=utf-8, UTF-8 sem BOM e LF final. São exibidos até 100 diagnósticos e 50 linhas de nomes com 10.000 unidades totais, indicando omissões. Clipboard negado oferece cópia manual explícita do código completo. Um BOM inicial é retirado apenas no parsing; posições usam o texto original. Cancelar encerra o Worker; edição, modo, ordem e opções invalidam a saída. O processamento fica em Worker local, offline após carregar os assets, sem uploads, armazenamento ou dados nos links relacionados. JavaScript e Worker são necessários; C# gerado não é compilado nem executado no navegador.