Générez des modèles C# à partir d’exemples JSON complets
Inférez localement des classes C# avec clés JSON exactes, présence JsonRequired et capacités explicites des annotations nullable et nombres raw.
Espace de travail de l’outil
JSON vers C#
C# 12 / .NET 8 ; System.Text.Json et bibliothèque standard uniquement.
JsonRequired exige la présence, pas une référence non null. Les propriétés facultatives nullable, dont JsonElement?, confondent absence et null. Les lexèmes entiers dans int64 sans zéro négatif utilisent long ; les autres nombres utilisent JsonElement. Les helpers racines désérialisent sans valider le contrat inféré. Les valeurs avec substituts isolés conservent un avertissement du parser mais System.Text.Json les rejette à l’exécution.
Activez JavaScript pour générer le code. Vous pouvez lire et modifier le JSON.
Ce navigateur ne peut pas démarrer le Worker local. La génération est indisponible.
Tous les éléments et documents contribuent au même contrat. Un tableau racine reste un tableau. Un champ absent diffère de null.
Jusqu’à 20 documents, 1 000 000 d’unités UTF-16 en entrée et 2 000 000 en sortie ; d’autres budgets de ressources s’appliquent.
Votre JSON est traité localement dans un Worker du navigateur. Il n’est ni envoyé ni enregistré.
Passer à un document conserve uniquement l’exemple actif. Confirmez ou annulez.
Utilisez 1 à 64 lettres et chiffres ASCII, en commençant par une lettre. Les noms réservés sont rejetés.
Prêt à recevoir du JSON.
Certains détails de diagnostic sont omis. Les totaux des avertissements restent visibles.
Détail des noms
Le presse-papiers est indisponible ou son accès est refusé. Téléchargez le fichier ou ouvrez explicitement le code complet pour le copier. Un fichier volumineux peut prendre plus de temps à afficher.
Exemples complets et tableaux racines
Collez du JSON strict ou choisissez un fichier UTF-8 local. Générez à partir d’un document ou de vingt exemples complets au maximum. Tous les éléments et champs tardifs contribuent ; un tableau racine reste un tableau. Les entrées vides, clés décodées en double, commentaires, virgules finales et documents concaténés arrêtent la génération en conservant vos exemples.
L’éditeur indique l’exemple actif et le total. Après la génération, consultez le nom du fichier, l’expression du type racine, le nombre de nœuds JSON et la taille du code complet. Ces informations décrivent le résultat actuel ; la copie et le téléchargement incluent tout le fichier même lorsque l’aperçu est limité.
[{"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)!;
}
Attributs exacts, présence requise et capacités nullable
Chaque propriété reçoit JsonPropertyName avec sa clé exacte, même si elle correspond au membre PascalCase. Guillemets, backslash, contrôles, emoji, NFC et NFD restent distincts. Seuls les identifiants changent en cas de collision, de nom de classe ou de membre hérité comme Equals et GetType. Les substituts isolés dans les clés arrêtent la génération. La sortie utilise des classes public sealed dans namespace Generated, propriétés publiques get/set et types standard globalement qualifiés, sans namespace configurable, records, packages ni converters personnalisés.
JsonRequired exige la présence ; omettre une propriété requise provoque JsonException. Les propriétés facultatives n’ont pas JsonRequired et utilisent T? ou JsonElement? pour raw. Absence et null explicite peuvent devenir null, même pour raw facultatif ; un avertissement explique cette confusion. Null seul requis utilise JsonElement avec ValueKind Null. Les références requises non nullable sont initialisées à default! pour l’analyse statique, sans ajouter de valeur de données valide. Les annotations nullable de .NET 8 ne rejettent pas null explicite dans les références requises ; un avertissement global l’explique. WhenWritingNull n’est pas activé et aucun round-trip préservant la présence n’est garanti.
Nombres et export local complet
Les lexèmes entiers purs dans int64, sans zéro négatif, utilisent long, notamment 9007199254740993 et les limites int64. Décimales, exposants, -0 et entiers hors int64 utilisent JsonElement avec avertissement de nombre raw ; GetRawText conserve le lexème. Les avertissements de précision du parser restent visibles. Unknown, null seul et unions de plusieurs branches non null utilisent JsonElement avec avertissements ; les objets vides utilisent Dictionary<string, JsonElement>. Une racine objet non vide est une classe directe ; les autres racines ont un helper public static Deserialize(string json), y compris listes, primitives et objet/null. Il délègue à System.Text.Json sans valider le contrat inféré. Un substitut isolé dans une valeur string permet de générer le type, mais le consommateur .NET 8 rejette cette valeur ; l’avertissement du parser reste visible.
Limites : 20 exemples, 1 000 000 unités UTF-16 d’entrée, 4 000 000 octets UTF-8 au total et par fichier, profondeur 200, 100 000 nœuds/visites d’inférence, 1 000 000 unités de parsing, 10 000 types, 20 000 champs, 2 000 000 unités de fusion, 2 000 déclarations, 4 000 000 unités d’émission et 15 secondes. Sortie : 2 000 000 unités UTF-16 et 8 000 000 octets. Ces maxima ne sont pas nécessairement atteignables ensemble ; dépasser une limite ne produit aucun code partiel.
L’aperçu contient au maximum 20 000 unités UTF-16 ; copier et télécharger incluent tout Types.cs courant en text/plain;charset=utf-8, UTF-8 sans BOM et LF final. Au maximum 100 diagnostics et 50 lignes de noms totalisant 10 000 unités sont affichés avec le nombre omis. Le refus du presse-papiers propose une copie manuelle explicite du code complet. Un BOM initial est retiré uniquement au parsing ; les positions utilisent le texte original. Annuler termine le Worker ; édition, mode, ordre et options invalident la sortie. Le traitement reste dans un Worker local, hors ligne après chargement des assets, sans envoi, stockage ni données dans les liens associés. JavaScript et Worker sont nécessaires ; le C# généré n’est jamais compilé ou exécuté dans le navigateur.