JSON en classe C#

Générez des classes C# à partir de JSON

À propos de l’outil JSON en classe C#

L’outil JSON en classe C# écrit les classes de modèle C# d’un échantillon JSON ou d’un JSON Schema avec quicktype-core, dans votre navigateur. Le code est placé dans l’espace de noms de votre choix (App par défaut), avec les directives using du sérialiseur : System.Text.Json, avec un attribut [JsonPropertyName] sur chaque propriété, ou Newtonsoft.Json, avec [JsonProperty]. Chaque objet imbriqué devient une classe public partial, ou un record si « Records (C# 9+) » est coché ; celle du premier niveau prend le « Nom de la classe » (Root par défaut). Les propriétés sont en PascalCase et gardent chaque clé d’origine dans leur attribut. Les nombres entiers sont typés long, les décimaux double ou decimal, et les tableaux deviennent des tableaux comme Item[] ou des listes comme List<Item>. Les propriétés absentes de certains éléments d’un tableau sont nullables et ne sont pas écrites quand elles valent null. Une valeur de deux types, par exemple un nombre dans un élément et du texte dans un autre, ajoute une structure d’union et les classes JsonConverter dont elle a besoin. Le JSON peut être collé ou ouvert depuis un fichier .json ou .txt.

Exemple

Une commande avec ses lignes ; note n’apparaît que dans une ligne, elle devient donc nullable.

Entrée JSON

{"orderId": 1001, "total": 49.90, "paid": true,
 "items": [{"sku": "A1", "qty": 2}, {"sku": "B7", "qty": 1, "note": "gift"}]}

Sortie C#

namespace App
{
    using System;
    using System.Collections.Generic;

    using System.Text.Json;
    using System.Text.Json.Serialization;
    using System.Globalization;

    public partial class Root
    {
        [JsonPropertyName("orderId")]
        public long OrderId { get; set; }

        [JsonPropertyName("total")]
        public double Total { get; set; }

        [JsonPropertyName("paid")]
        public bool Paid { get; set; }

        [JsonPropertyName("items")]
        public Item[] Items { get; set; }
    }

    public partial class Item
    {
        [JsonPropertyName("sku")]
        public string Sku { get; set; }

        [JsonPropertyName("qty")]
        public long Qty { get; set; }

        [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
        [JsonPropertyName("note")]
        public string? Note { get; set; }
    }
}

Comment générer des classes C# à partir de JSON

  1. 1Collez un échantillon JSON dans « Entrée JSON », ou cliquez sur « Ouvrir un fichier » pour charger un fichier .json ou .txt. Pour un JSON Schema, choisissez « JSON Schema » dans « Source ».
  2. 2Choisissez le « Sérialiseur », puis donnez au « Nom de la classe » et à l’« Espace de noms » ceux de votre projet.
  3. 3Cliquez sur « Convertir » pour obtenir les classes dans « Sortie C# ».
  4. 4Cliquez sur « Copier », ou sur « Télécharger » pour enregistrer le code sous « Model.cs ».

Formats et limites

Entrée
Objet JSON ou tableau d’objets, ou JSON Schema, collé ou ouvert depuis un fichier .json ou .txt
Sortie
Classes ou records C# dans l’espace de noms de votre choix (App par défaut), enregistrés sous Model.cs
Sérialiseur
System.Text.Json : [JsonPropertyName] sur chaque propriété, [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] sur les propriétés optionnelles ; ou Newtonsoft.Json : [JsonProperty], avec NullValueHandling.Ignore sur les propriétés optionnelles
Types
long, double ou decimal, bool, string, et tableaux (T[]) ou listes (List<T>) ; object pour une clé qui vaut null dans tout l’échantillon ; une structure d’union quand une valeur a deux types ; depuis un JSON Schema, aussi des enums et DateTimeOffset

Où votre JSON est traité

Les classes sont générées par du JavaScript qui s’exécute sur votre appareil : le JSON que vous collez ou ouvrez et le C# obtenu ne sont jamais envoyés. La bibliothèque quicktype se charge à votre premier clic sur « Convertir ». Si la page affiche une erreur, notre journal des erreurs en reçoit le texte, débarrassé des fragments cités, des nombres longs et des adresses web ou e-mail, avec le nom de l’outil ainsi que le nom et la version de votre navigateur.

Questions fréquentes

Est-ce que cela fonctionne avec Newtonsoft.Json (Json.NET) ?

Oui. Choisissez Newtonsoft.Json dans « Sérialiseur » : chaque propriété reçoit alors un attribut [JsonProperty] avec sa clé d’origine, et les propriétés optionnelles y ajoutent NullValueHandling = NullValueHandling.Ignore. Lisez le JSON avec JsonConvert.DeserializeObject<Root>(json), en ajoutant Converter.Settings quand la sortie le contient.

Puis-je partir d’un JSON Schema ?

Oui. Choisissez « JSON Schema » dans « Source », puis collez ou ouvrez le schéma. Les types, les propriétés obligatoires, les enums et les formats date-time viennent du schéma. Un $ref n’est suivi qu’à l’intérieur du document (#/definitions/… ou #/$defs/…) : un schéma situé à une autre adresse n’est jamais téléchargé, et la page le signale.

Puis-je obtenir des records au lieu de classes ?

Oui. Cochez « Records (C# 9+) » : chaque type de modèle devient un record public partial avec les mêmes propriétés et attributs, ce qui demande C# 9 ou plus récent (.NET 5 ou plus récent). Les structures d’union et les classes de conversion restent telles quelles.

Les classes désérialisent-elles mon JSON telles quelles ?

Oui, quand chaque clé garde un seul type : JsonSerializer.Deserialize relie chaque propriété à sa clé d’origine grâce à [JsonPropertyName]. Quand une valeur mélange plusieurs types, passez en second argument Converter.Settings, que la sortie contient alors. Les types viennent uniquement de votre échantillon : vérifiez-les avec davantage de données.

Une propriété est-elle typée object quand sa valeur est toujours null ?

Oui. Quand une clé vaut null dans tous les éléments de votre échantillon, aucun type ne peut être déduit, elle devient donc object. Collez un exemple où la clé contient une vraie valeur, ou indiquez le type vous-même, par exemple string? pour un texte optionnel.

Puis-je utiliser int au lieu de long ?

Oui. Les nombres entiers sont toujours typés long pour que les grandes valeurs tiennent ; si vos valeurs sont petites, remplacez long par int à la main : l’attribut et la correspondance avec la clé continuent de fonctionner.

Trucs et astuces

  • ✓Collez un tableau de plusieurs éléments pour que les propriétés parfois absentes deviennent nullables.
  • ✓Choisissez decimal dans « Nombres décimaux » pour les prix et les montants : double ne peut pas représenter exactement des valeurs comme 0,1.