BLOG · .NET · APIs

Accélérez vos APIs .NET avec 6 attributs System.Text.Json

Illustration : l'attribut JsonIgnore dans une fenêtre de code

Vos applications .NET utilisent forcément du JSON. Mais beaucoup de développeurs n'exploitent pas tout le potentiel de System.Text.Json.

Avec les bons attributs, vous pouvez réduire la taille des réponses, contrôler précisément les données exposées et gagner nettement en performance.

1. [JsonPropertyName]

Permet de renommer une propriété dans le JSON. Indispensable pour respecter une convention externe (snake_case, camelCase...) ou aligner votre contrat avec une API tierce.

[JsonPropertyName("release_year")]
public int ReleaseYear { get; set; }

2. [JsonIgnore]

Exclut un champ de la sérialisation et de la désérialisation. Une bonne pratique pour éviter d'exposer des données sensibles (mot de passe, token, montant interne...) dans les réponses JSON.

[JsonIgnore]
public string PasswordHash { get; set; }

3. [JsonIgnore(Condition = WhenWritingNull)]

Ignore les propriétés dont la valeur est null. Résultat : un JSON plus léger et plus lisible, surtout utile pour les APIs REST qui renvoient des objets complexes avec beaucoup d'options facultatives.

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? CommentaireLivraison { get; set; }

4. [JsonInclude]

Force l'inclusion de propriétés non publiques (par exemple avec un setter privé). Utile si vous travaillez avec des objets métier encapsulés et souhaitez quand même exposer certaines données en sortie.

[JsonInclude]
public string Reference { get; private set; }

5. [JsonConstructor]

Définit explicitement le constructeur à utiliser lors de la désérialisation. Indispensable si votre classe n'a pas de constructeur sans paramètre, ou si plusieurs surcharges sont possibles.

[JsonConstructor]
public Commande(Guid id, decimal montant) { ... }

6. [JsonExtensionData]

Capture tous les champs JSON non mappés dans un dictionnaire. Ça permet de tolérer des variations de structure sans planter l'application : pratique pour des données partiellement dynamiques ou des évolutions d'API.

[JsonExtensionData]
public Dictionary<string, JsonElement>? ChampsInconnus { get; set; }

Bonus : pour aller plus loin

Il y a aussi d'autres attributs utiles : JsonNumberHandling pour lire des nombres en string, JsonPolymorphic et JsonDerivedType pour gérer l'héritage, JsonUnmappedMemberHandling pour les propriétés inconnues. Et côté performance, la source generation avec JsonSerializable est super intéressante : la sérialisation est générée à la compilation, sans réflexion.

À retenir : ces attributs permettent d'améliorer vos APIs sans revoir toute la structure de vos objets. Vous gardez le contrôle sur le format émis et accepté, vous limitez les effets de bord en cas d'évolution des modèles, et vous optimisez les échanges.

Cet article est tiré d'une de mes publications LinkedIn : rejoignez la discussion ↗