Sérialisation et désérialisation JSON (marshalling et unmarshalling) dans .NET - vue d’ensemble
L’espace de noms System.Text.Json fournit des fonctionnalités de sérialisation vers et de désérialisation à partir de JavaScript Object Notation (JSON). La sérialisation est le processus de conversion de l’état d’un objet, c’est-à-dire les valeurs de ses propriétés, dans une forme qui peut être stockée ou transmise. La forme sérialisée n’inclut aucune information sur les méthodes associées d’un objet. La désérialisation reconstruit un objet à partir de la forme sérialisée.
La conception de la bibliothèque System.Text.Json
met l’accent sur les performances élevées et la faible allocation de mémoire sur un ensemble complet de fonctionnalités. La prise en charge intégrée d’UTF-8 optimise le processus de lecture et d’écriture de texte JSON encodé en UTF-8, qui est l’encodage le plus répandu pour les données sur le web et les fichiers sur disque.
La bibliothèque fournit également des classes pour utiliser un modèle DOM (document object model) en mémoire. Cette fonctionnalité permet un accès aléatoire aux éléments d’un fichier ou d’une chaîne JSON.
Pour Visual Basic, il existe des limitations sur les parties de la bibliothèque que vous pouvez utiliser. Pour plus d’informations, consultez le Support Visual Basic.
Comment obtenir la bibliothèque
La bibliothèque est intégrée dans le cadre du framework partagé pour .NET Core 3.0 et versions ultérieures. La fonctionnalité de génération de source est intégrée dans le cadre du framework partagé pour .NET 6 et versions ultérieures.
Pour les versions de framework antérieures à .NET Core 3.0, installez le package NuGet System.Text.Json. Le package prend en charge :
- .NET Standard 2.0 et ultérieur
- .NET Framework 4.6.2 et versions ultérieures
- .NET Core 2.1 et ultérieur
- .NET 5 et versions ultérieures
Espaces de noms et API
- L’espace de noms System.Text.Json contient tous les points d’entrée et les types principaux.
- L’espace de noms System.Text.Json.Serialization contient des attributs et des API pour les scénarios avancés, et la personnalisation spécifique à la sérialisation et à la désérialisation.
Les exemples de code présentés dans cet article nécessitent des directives using
pour l’un de ces espaces de noms ou les deux.
Important
System.Text.Json
ne prend pas en charge les API de sérialisation suivantes (que vous avez éventuellement déjà utilisées) :
- Attributs provenant de l’espace de noms System.Runtime.Serialization.
- L’attribut System.SerializableAttribute et l’interface ISerializable. Ces types sont utilisés uniquement pour la Sérialisation binaire et XML.
Méthodes d’extension HttpClient et HttpContent
La sérialisation et la désérialisation des charges utiles JSON à partir du réseau sont des opérations courantes. Les méthodes d’extension sur HttpClient et HttpContent vous permettent d’effectuer ces opérations en une seule ligne de code. Ces méthodes d’extension utilisent des valeurs web par défaut pour JsonSerializerOptions.
L’exemple suivant illustre l’utilisation de HttpClientJsonExtensions.GetFromJsonAsync et HttpClientJsonExtensions.PostAsJsonAsync :
using System.Net.Http.Json;
namespace HttpClientExtensionMethods
{
public class User
{
public int Id { get; set; }
public string? Name { get; set; }
public string? Username { get; set; }
public string? Email { get; set; }
}
public class Program
{
public static async Task Main()
{
using HttpClient client = new()
{
BaseAddress = new Uri("https://jsonplaceholder.typicode.com")
};
// Get the user information.
User? user = await client.GetFromJsonAsync<User>("users/1");
Console.WriteLine($"Id: {user?.Id}");
Console.WriteLine($"Name: {user?.Name}");
Console.WriteLine($"Username: {user?.Username}");
Console.WriteLine($"Email: {user?.Email}");
// Post a new user.
HttpResponseMessage response = await client.PostAsJsonAsync("users", user);
Console.WriteLine(
$"{(response.IsSuccessStatusCode ? "Success" : "Error")} - {response.StatusCode}");
}
}
}
// Produces output like the following example but with different names:
//
//Id: 1
//Name: Tyler King
//Username: Tyler
//Email: Tyler@contoso.com
//Success - Created
Imports System.Net.Http
Imports System.Net.Http.Json
Namespace HttpClientExtensionMethods
Public Class User
Public Property Id As Integer
Public Property Name As String
Public Property Username As String
Public Property Email As String
End Class
Public Class Program
Public Shared Async Function Main() As Task
Using client As New HttpClient With {
.BaseAddress = New Uri("https://jsonplaceholder.typicode.com")
}
' Get the user information.
Dim user1 As User = Await client.GetFromJsonAsync(Of User)("users/1")
Console.WriteLine($"Id: {user1.Id}")
Console.WriteLine($"Name: {user1.Name}")
Console.WriteLine($"Username: {user1.Username}")
Console.WriteLine($"Email: {user1.Email}")
' Post a new user.
Dim response As HttpResponseMessage = Await client.PostAsJsonAsync("users", user1)
Console.WriteLine(
$"{(If(response.IsSuccessStatusCode, "Success", "Error"))} - {response.StatusCode}")
End Using
End Function
End Class
End Namespace
' Produces output like the following example but with different names:
'
'Id: 1
'Name: Tyler King
'Username: Tyler
'Email: Tyler@contoso.com
'Success - Created
Il existe également des méthodes d’extension pour System.Text.Json sur HttpContent.
Réflexion et génération de source
Par défaut, System.Text.Json
collecte les métadonnées dont il a besoin pour accéder aux propriétés des objets pour la sérialisation et la désérialisation au moment du temps d’exécution en utilisant réflexion. En guise d’alternative, System.Text.Json
peut utiliser la fonctionnalité de génération de source C# pour améliorer les performances, réduire l’utilisation de la mémoire privée et faciliter le découpage d’assembly, ce qui réduit la taille de l’application.
Pour plus d’informations, voir Réflexion et génération de sources.
Informations de sécurité
Pour plus d’informations sur les menaces de sécurité qui ont été prises en compte lors de la conception de JsonSerializer et sur la façon dont elles peuvent être atténuées, consultez Modèle de menace System.Text.Json
.
Sécurité des threads
Le sérialiseur System.Text.Json
a été conçu en gardant à l’esprit la sécurité des threads. En pratique, cela signifie qu’une fois verrouillées, les instances JsonSerializerOptions peuvent être partagées de façon sécurisée entre plusieurs threads. JsonDocument fournit une représentation DOM thread-safe, immuable et dans .NET 8 (et les versions ultérieures), pour les valeurs JSON.