Serializace a deserializace JSON (zařazování a zrušení zařazování) v .NET – přehled
Obor System.Text.Json názvů poskytuje funkce pro serializaci do a deserializaci z JavaScript Object Notation (JSON). Serializace je proces převodu stavu objektu, tj. hodnoty jeho vlastností, do formuláře, který lze uložit nebo přenést. Serializovaný formulář neobsahuje žádné informace o přidružených metodách objektu. Deserializace rekonstruuje objekt ze serializované formy.
Návrh System.Text.Json
knihovny zdůrazňuje vysoký výkon a nízké přidělení paměti nad rozsáhlou sadou funkcí. Integrovaná podpora UTF-8 optimalizuje proces čtení a zápisu textu JSON kódovaného jako UTF-8, což je nejběžnější kódování dat na webu a souborech na disku.
Knihovna také poskytuje třídy pro práci s objektovým modelem dokumentu v paměti (DOM). Tato funkce umožňuje náhodný přístup k prvkům v souboru NEBO řetězci JSON.
Pro Visual Basic platí určitá omezení pro části knihovny, které můžete použít. Další informace naleznete v tématu Podpora jazyka Visual Basic.
Jak získat knihovnu
Knihovna je integrovaná jako součást sdíleného rozhraní pro .NET Core 3.0 a novější verze. Funkce generování zdroje je integrovaná jako součást sdílené architektury pro .NET 6 a novější verze.
Pro verze rozhraní starší než .NET Core 3.0 nainstalujte System.Text.Json balíček NuGet. Balíček podporuje:
- .NET Standard 2.0 a novější
- .NET Framework 4.6.2 a novější
- .NET Core 2.1 a novější
- .NET 5 a novější
Obory názvů a rozhraní API
- Obor System.Text.Json názvů obsahuje všechny vstupní body a hlavní typy.
- Obor System.Text.Json.Serialization názvů obsahuje atributy a rozhraní API pro pokročilé scénáře a přizpůsobení specifické pro serializaci a deserializaci.
Příklady kódu uvedené v tomto článku vyžadují using
direktivy pro jeden nebo oba tyto obory názvů.
Důležité
System.Text.Json
nepodporuje následující rozhraní API serializace, která jste mohli použít dříve:
- Atributy z System.Runtime.Serialization oboru názvů
- Atribut System.SerializableAttribute a ISerializable rozhraní. Tyto typy se používají pouze pro binární serializaci a serializaci XML.
Metody rozšíření HttpClient a HttpContent
Serializace a deserializace datových částí JSON ze sítě jsou běžné operace. Metody rozšíření v HttpClient a HttpContent umožňují provádět tyto operace v jednom řádku kódu. Tyto metody rozšíření používají webové výchozí hodnoty pro JsonSerializerOptions.
Následující příklad ilustruje použití a HttpClientJsonExtensions.GetFromJsonAsync 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
Existují také rozšiřující metody pro System.Text.Json httpContent.
Reflexe versus generování zdroje
Ve výchozím nastavení shromažďuje metadata, System.Text.Json
která potřebuje pro přístup k vlastnostem objektů pro serializaci a deserializaci za běhu pomocí reflexe. Jako alternativu System.Text.Json
můžete pomocí funkce generování zdroje C# zlepšit výkon, snížit využití privátní paměti a usnadnit oříznutí sestavení, což snižuje velikost aplikace.
Další informace najdete v tématu Reflexe a generování zdroje.
Informace o zabezpečení
Informace o bezpečnostních hrozbách, které byly při návrhu zvažovány JsonSerializera jak je lze zmírnit, najdete v tématu System.Text.Json
Model hrozeb.
Bezpečnost vlákna
System.Text.Json
Serializátor byl navržen s ohledem na bezpečnost vláken. Prakticky to znamená, že po uzamčení JsonSerializerOptions se instance dají bezpečně sdílet napříč několika vlákny. JsonDocument poskytuje neměnnou a v .NET 8 a novějších verzích reprezentaci MODELU DOM pro hodnoty JSON.