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:

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.GetFromJsonAsyncHttpClientJsonExtensions.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 ion vs. 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 ion versus 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.

Další materiály