JSON szerializálás és deszerializálás (rendezés és szétbontás) a .NET-ben – áttekintés

A System.Text.Json névtér a JavaScript Object Notation (JSON) szolgáltatásba való szerializáláshoz és deszerializáláshoz használható. A szerializálás egy objektum állapotának, vagyis tulajdonságainak egy tárolható vagy továbbítható formájává alakításának folyamata. A szerializált űrlap nem tartalmaz semmilyen információt az objektum társított metódusairól. A deszerializálás rekonstruál egy objektumot a szerializált űrlapból.

A System.Text.Json kódtár kialakítása nagy teljesítményt és alacsony memóriakiosztást hangsúlyoz egy átfogó funkciókészleten keresztül. A beépített UTF-8-támogatás optimalizálja az UTF-8-ként kódolt JSON-szövegek olvasásának és írásának folyamatát, amely a webes adatok és a lemezen lévő fájlok leggyakoribb kódolása.

A tár osztályokat is biztosít a memóriabeli dokumentumobjektum-modell (DOM) használatához. Ez a funkció véletlenszerű hozzáférést tesz lehetővé egy JSON-fájl vagy sztring elemeihez.

A Visual Basic esetében bizonyos korlátozások vonatkoznak a tár használható részeire. További információ: Visual Basic-támogatás.

A kódtár lekérése

A kódtár a .NET Core 3.0-s és újabb verzióihoz készült megosztott keretrendszer részeként beépített. A forrásgenerálási funkció a .NET 6-os és újabb verziók megosztott keretrendszerének részeként beépített.

A .NET Core 3.0-nál korábbi keretrendszerverziók esetén telepítse a System.Text.Json NuGet-csomagot. A csomag a következőket támogatja:

  • .NET Standard 2.0 és újabb verziók
  • .NET-keretrendszer 4.6.2 és újabb verziók
  • .NET Core 2.1 és újabb verziók
  • .NET 5 és újabb verziók

Névterek és API-k

  • A System.Text.Json névtér tartalmazza az összes belépési pontot és a fő típusokat.
  • A System.Text.Json.Serialization névtér attribútumokat és API-kat tartalmaz a speciális forgatókönyvekhez és a szerializáláshoz és deszerializáláshoz kapcsolódó testreszabáshoz.

Az ebben a cikkben bemutatott kód példájához irányelvek szükségesek using ezen névterek egyikéhez vagy mindkettőhöz.

Fontos

System.Text.Json nem támogatja a korábban esetleg használt szerializálási API-kat:

HttpClient és HttpContent kiterjesztési módszerek

A JSON hasznos adatainak szerializálása és deszerializálása a hálózatról gyakori műveletek. A HttpClient- és HttpContent-bővítménymetszetekkel ezeket a műveleteket egyetlen kódsoron hajthatja végre. Ezek a bővítménymetelyek a JsonSerializerOptions webes alapértelmezéseit használják.

Az alábbi példa a következők HttpClientJsonExtensions.PostAsJsonAsynchasználatát szemléltetiHttpClientJsonExtensions.GetFromJsonAsync:

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

A HttpContenten is vannak bővítménymetodusokSystem.Text.Json.

Önkifejezés ion vs. source generation

Alapértelmezés szerint összegyűjti azokat a metaadatokat, System.Text.Json amelyekre szüksége van az objektumok tulajdonságainak eléréséhez a szerializáláshoz és a deszerializáláshoz futásidőben a tükröződés használatával. Alternatív megoldásként System.Text.Json használhatja a C#-forrásgenerálási funkciót a teljesítmény javítására, a magánmemória-használat csökkentésére és az szerelvény vágásának megkönnyítésére, ami csökkenti az alkalmazás méretét.

További információ: Önkifejezés ion és forrásgenerálás.

Biztonsági információk

A tervezés JsonSerializersorán figyelembe vett biztonsági fenyegetésekről és azok elhárításának módjáról a fenyegetésmodellben olvashatSystem.Text.Json.

Menetbiztonság

A System.Text.Json szerializálót a szálbiztonság szem előtt tartásával tervezték. Ez gyakorlatilag azt jelenti, JsonSerializerOptions hogy a zárolt példányok biztonságosan megoszthatók több szál között. JsonDocument nem módosítható, a .NET 8 és újabb verzióiban pedig szálbiztos, DOM-reprezentációt biztosít a JSON-értékekhez.

További erőforrások