Convertir JSON en C#
JSON vers classes C# génère des classes ou des records à partir d’un document d’exemple, dans votre navigateur. Les noms de propriétés sont en PascalCase et chacune porte un attribut explicite contenant la clé JSON d’origine, car System.Text.Json distingue la casse par défaut et une propriété PascalCase ne sera pas mappée sur une clé snake_case tant qu’on ne le lui a pas dit.
Le document s’arrête trop tôt — il semble tronqué.
^
Comment fonctionne Convertir JSON en C# ?
C# est la cible où le réglage des types référence nullables change ce à quoi ressemble une sortie correcte, si bien que le générateur le traite comme une option de premier plan plutôt que comme une préférence de formatage.
Les types référence nullables décident de la forme de chaque membre
Avec <Nullable>enable</Nullable>, la valeur par défaut de tous les modèles depuis .NET 6, une propriété string que JSON peut laisser absente est un avertissement qui n’attend que de se déclencher, et une NullReferenceException si l’avertissement est ignoré. Les champs optionnels et nullables reçoivent donc un ? — qui, sur un type valeur, est Nullable<T>, et sur un type référence, l’annotation. Les deux s’écrivent T ?, ce qui fait partie des choses les plus propres du langage.
Les membres non nullables ont besoin d’un initialisateur, sinon CS8618 se déclenche sur chacun
Une propriété requise string Name { get; set; } déclenche un avertissement parce qu’elle n’est pas initialisée, car le compilateur ne peut pas voir qu’un désérialiseur la remplira. La réponse conventionnelle du code généré est = null!; — une promesse explicite au compilateur que quelque chose d’autre l’assignera. Sans elle, le fichier généré produit un avertissement par propriété, que les gens corrigent en désactivant nullable — ce qui jette la raison même de l’utiliser.
Les attributs sont explicites, pas conventionnels
System.Text.Json rapproche les noms de propriétés en distinguant la casse, sauf configuration contraire, donc UserId ne se lie pas à user_id et reste null en silence. Chaque propriété reçoit un [JsonPropertyName] (ou [JsonProperty] pour Newtonsoft) portant la clé d’origine exacte, si bien que la classe fonctionne quelles que soient les options du sérialiseur.
class ou record
Un record est le meilleur choix par défaut pour une charge utile désérialisée — l’égalité par valeur et un ToString lisible sont gratuits, et un DTO ne devrait pas être modifié après son arrivée. Beaucoup de code attend encore une classe mutable avec des propriétés modifiables, donc les deux sont disponibles.
long là où int tronquerait
int est codé sur 32 bits. Toute valeur d’exemple au-delà de 2,147,483,647 — un identifiant snowflake, un horodatage en millisecondes — est émise en long, car un identifiant tronqué est un bug qui n’apparaît qu’une fois les vraies données arrivées.
Exemple
[
{ "user_id": 900719925474099, "name": "Ada" },
{ "user_id": 12, "name": "Grace", "team": "ops" }
]Généré
public class User
{
[JsonPropertyName("user_id")]
public long UserId { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; } = null!;
[JsonPropertyName("team")]
public string? Team { get; set; }
}Quelles options et quels cas limites Convertir JSON en C# prend en charge ?
| Paramètre | Type | Valeur par défaut | Comportement et cas limites |
|---|---|---|---|
| Forme | class / record | class | record donne l’égalité des valeurs et une ToString utile, ce qui convient à un DTO. class reste mutable et correspond à ce que le code plus ancien attend. |
| Espace de noms | identifiant | Generated | Encapsule la sortie dans un bloc de namespace. Laissez-le vide pour émettre des types bruts pour un fichier qui en a déjà un. |
| System.Text.Json | booléen | on | Émet [JsonPropertyName] et l’instruction using correspondante. Désactivez-le pour [JsonProperty] et Newtonsoft.Json, qui reste le bon choix pour tout ce qui est sur .NET Framework. |
| nullable | booléen | on | Émet #nullable enable, marque les membres optionnels comme T?, et initialise les membres de référence requis avec = null! pour que CS8618 ne se déclenche pas sur chaque propriété. |
| string | type C# | string | Les formats détectés ne sont pas mappés sur DateTime ou Guid. System.Text.Json analyse ISO 8601 en DateTime si vous changez manuellement le type, mais il lève une exception sur tout enregistrement formate différemment. |
| Entier | type C# | int / long | long quand un exemple dépasse 2,147,483,647. Les nombres JSON n’ont pas de largeur déclarée, donc cela est lu à partir des valeurs. |
| Tableau | type C# | List<T> | List<T> plutôt que T[], car les deux sérialiseurs le gèrent et c’est ce que le code appelant attend habituellement. Un tableau de types mélangés devient List<object>. |
| Objet imbriqué | class | type propre | Promu à sa propre classe, déclaré avant le type qui l’utilise. Des formes identiques partagent une classe plutôt que de générer Address, Address2, Address3. |
Questions fréquentes
Pourquoi chaque propriété a-t-elle un attribut alors que mes clés sont déjà en PascalCase ?
Parce que la liaison n’est garantie qu’avec lui. System.Text.Json distingue la casse tant que PropertyNameCaseInsensitive n’est pas défini, et même alors il ne reliera pas user_id à UserId — il faudrait une stratégie de nommage que la classe générée ne peut pas supposer configurée. Un attribut explicite rend la classe correcte quelles que soient les options du sérialiseur, et cela vaut bien la ligne.
Qu’est-ce que = null! et puis-je le supprimer ?
Il indique au compilateur qu’une propriété référence non nullable sera assignée par quelque chose qu’il ne voit pas — le désérialiseur — et supprime CS8618. Vous pouvez le supprimer si vous rendez la propriété required (C# 11) ou si vous l’initialisez dans un constructeur. Ce qu’il ne faut pas faire, c’est désactiver les types référence nullables pour faire taire les avertissements — c’est la réaction habituelle, et elle jette la fonctionnalité qui aurait attrapé le vrai null.
Faut-il utiliser record ou class ?
record pour une charge utile que vous désérialisez et lisez : l’égalité par valeur rend les tests bien plus propres, et l’immutabilité est correcte pour des données venues d’ailleurs. class si l’objet va être modifié, si vous êtes sur un framework antérieur à C# 9, ou si une base de code existante attend des propriétés modifiables partout.
Pourquoi ma date est-elle une string ?
Parce que générer un DateTime à partir d’un échantillon produirait une classe qui lève une exception dès le premier enregistrement dont la date est formatée autrement. System.Text.Json n’accepte qu’ISO 8601, et les vraies API émettent des horodatages Unix, des dates au format américain et des décalages sans deux-points. Le format détecté est signalé, pour que vous puissiez changer le type en connaissance de cause, avec un convertisseur si le format en exige un.
Newtonsoft ou System.Text.Json ?
System.Text.Json pour tout ce qui tourne sur .NET moderne — il est livré en standard, il est nettement plus rapide, et c’est là que l’effort de développement se porte. Newtonsoft si vous êtes sur .NET Framework, ou si vous dépendez de quelque chose que System.Text.Json ne fait toujours pas : TypeNameHandling, des résolveurs de contrat personnalisés, ou le parsing plus tolérant des entrées malformées. Le générateur émet les bons attributs dans les deux cas.
Mon JSON est-il envoyé ?
Non. Le document est parsé, les types sont déduits et le code est rendu dans l’onglet déjà ouvert. Vous pouvez le vérifier dans le panneau Réseau. Cela compte pour la raison habituelle : les échantillons que les gens collent dans un générateur de classes sont de vraies réponses, souvent encore chargées de données clients.
Quels outils liés devriez-vous utiliser ensuite ?
- Convertir JSON en CSVTransforme des enregistrements en feuille de calcul, imbrications comprises
- Convertir CSV en JSONLit un export de feuille de calcul, guillemets compris
- Sérialiser du JSONÉchappe un document en chaîne prête à intégrer
- Récupérer du JSON échappéRetrouve un document noyé dans les séquences d’échappement