Megosztás a következőn keresztül:


Nem módosítható típusok és tulajdonságok használata

Nem módosítható típus , amely megakadályozza, hogy a példányosítás után megváltoztassák az objektumok tulajdonságát vagy mezőértékeit. A típus lehet rekord, nincs nyilvános tulajdonsága vagy mezője, írásvédett tulajdonságokkal rendelkezik, vagy privát vagy csak init-only típusú beállításokkal rendelkezik. System.String egy nem módosítható típusra példa. System.Text.Json különböző módokon deszerializálhatja a JSON-t a nem módosítható típusok között.

Paraméteres konstruktorok

Alapértelmezés szerint System.Text.Json az alapértelmezett nyilvános paraméter nélküli konstruktort használja. Azonban megadhatja, hogy paraméteres konstruktort használjon, ami lehetővé teszi egy nem módosítható osztály vagy szerkezet deszerializálását.

  • Egy osztály esetében, ha az egyetlen konstruktor paraméterezett, akkor a rendszer ezt a konstruktort fogja használni.

  • Egy szerkezet vagy több konstruktort tartalmazó osztály esetében adja meg a [JsonConstructor] attribútum alkalmazásával használni kívánt osztályt. Ha az attribútum nincs használatban, a rendszer mindig nyilvános paraméter nélküli konstruktort használ, ha van ilyen.

    Az alábbi példa az attribútumot [JsonConstructor] használja:

    using System.Text.Json;
    using System.Text.Json.Serialization;
    
    namespace ImmutableTypes
    {
        public struct Forecast
        {
            public DateTime Date { get; }
            public int TemperatureC { get; }
            public string Summary { get; }
     
            [JsonConstructor]
            public Forecast(DateTime date, int temperatureC, string summary) =>
                (Date, TemperatureC, Summary) = (date, temperatureC, summary);
        }
    
        public class Program
        {
            public static void Main()
            {
                string json = """
                    {
                        "date":"2020-09-06T11:31:01.923395-07:00",
                        "temperatureC":-1,
                        "summary":"Cold"
                    }
                    """;
                Console.WriteLine($"Input JSON: {json}");
    
                var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);
    
                Forecast forecast = JsonSerializer.Deserialize<Forecast>(json, options);
    
                Console.WriteLine($"forecast.Date: {forecast.Date}");
                Console.WriteLine($"forecast.TemperatureC: {forecast.TemperatureC}");
                Console.WriteLine($"forecast.Summary: {forecast.Summary}");
    
                string roundTrippedJson =
                    JsonSerializer.Serialize<Forecast>(forecast, options);
    
                Console.WriteLine($"Output JSON: {roundTrippedJson}");
            }
        }
    }
    
    // Produces output like the following example:
    //
    //Input JSON: { "date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"summary":"Cold"}
    //forecast.Date: 9 / 6 / 2020 11:31:01 AM
    //forecast.TemperatureC: -1
    //forecast.Summary: Cold
    //Output JSON: { "date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"summary":"Cold"}
    
    Imports System.Text.Json
    Imports System.Text.Json.Serialization
    
    Namespace ImmutableTypes
    
        Public Structure Forecast
            Public ReadOnly Property [Date] As Date
            Public ReadOnly Property TemperatureC As Integer
            Public ReadOnly Property Summary As String
    
            <JsonConstructor>
            Public Sub New([Date] As Date, TemperatureC As Integer, Summary As String)
                Me.Date = [Date]
                Me.TemperatureC = TemperatureC
                Me.Summary = Summary
            End Sub
    
        End Structure
    
        Public NotInheritable Class Program
    
            Public Shared Sub Main()
                Dim json As String = "{""date"":""2020-09-06T11:31:01.923395-07:00"",""temperatureC"":-1,""summary"":""Cold""}"
                Console.WriteLine($"Input JSON: {json}")
    
                Dim options As New JsonSerializerOptions(JsonSerializerDefaults.Web)
    
                Dim forecast1 As Forecast = JsonSerializer.Deserialize(Of Forecast)(json, options)
    
                Console.WriteLine($"forecast.Date: {forecast1.[Date]}")
                Console.WriteLine($"forecast.TemperatureC: {forecast1.TemperatureC}")
                Console.WriteLine($"forecast.Summary: {forecast1.Summary}")
    
                Dim roundTrippedJson As String = JsonSerializer.Serialize(forecast1, options)
    
                Console.WriteLine($"Output JSON: {roundTrippedJson}")
            End Sub
    
        End Class
    
    End Namespace
    
    ' Produces output like the following example:
    '
    'Input JSON: { "date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"summary":"Cold"}
    'forecast.Date: 9 / 6 / 2020 11:31:01 AM
    'forecast.TemperatureC: -1
    'forecast.Summary: Cold
    'Output JSON: { "date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"summary":"Cold"}
    

    A .NET 7 és korábbi verzióiban az [JsonConstructor] attribútum csak nyilvános konstruktorokkal használható.

A paraméteres konstruktor paraméterneveinek meg kell egyeznie a tulajdonságnevekkel és -típusokkal. Az egyezés kis- és nagybetűket nem érzékeny, és a konstruktorparaméternek akkor is meg kell egyeznie a tényleges tulajdonságnévvel, ha a [JsonPropertyName] nevet használja egy tulajdonság átnevezéséhez. Az alábbi példában a TemperatureC tulajdonság neve a JSON-ban módosul celsius , de a konstruktor paraméter neve továbbra is temperatureCa következő:

using System.Text.Json;
using System.Text.Json.Serialization;

namespace ImmutableTypesCtorParms
{
    public readonly struct Forecast
    {
        public DateTime Date { get; }
        [JsonPropertyName("celsius")]
        public int TemperatureC { get; }
        public string Summary { get; }
 
        [JsonConstructor]
        public Forecast(DateTime date, int temperatureC, string summary) =>
            (Date, TemperatureC, Summary) = (date, temperatureC, summary);
    }

    public class Program
    {
        public static void Main()
        {
            string json = """
                {
                    "date":"2020-09-06T11:31:01.923395-07:00",
                    "celsius":-1,
                    "summary":"Cold"
                }
                """;
            Console.WriteLine($"Input JSON: {json}");

            var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);

            Forecast forecast = JsonSerializer.Deserialize<Forecast>(json, options);

            Console.WriteLine($"forecast.Date: {forecast.Date}");
            Console.WriteLine($"forecast.TemperatureC: {forecast.TemperatureC}");
            Console.WriteLine($"forecast.Summary: {forecast.Summary}");

            string roundTrippedJson =
                JsonSerializer.Serialize<Forecast>(forecast, options);

            Console.WriteLine($"Output JSON: {roundTrippedJson}");

        }
    }
}

// Produces output like the following example:
//
//Input JSON: { "date":"2020-09-06T11:31:01.923395-07:00","celsius":-1,"summary":"Cold"}
//forecast.Date: 9 / 6 / 2020 11:31:01 AM
//forecast.TemperatureC: -1
//forecast.Summary: Cold
//Output JSON: { "date":"2020-09-06T11:31:01.923395-07:00","celsius":-1,"summary":"Cold"}

[JsonPropertyName]Emellett a következő attribútumok támogatják a deszerializálást paraméteres konstruktorokkal:

Rekordok

A rekordok szerializáláshoz és deszerializáláshoz is támogatottak, ahogy az alábbi példában is látható:

using System.Text.Json;

namespace Records
{
    public record Forecast(DateTime Date, int TemperatureC)
    {
        public string? Summary { get; init; }
    };

    public class Program
    {
        public static void Main()
        {
            Forecast forecast = new(DateTime.Now, 40)
            {
                Summary = "Hot!"
            };

            string forecastJson = JsonSerializer.Serialize<Forecast>(forecast);
            Console.WriteLine(forecastJson);
            Forecast? forecastObj = JsonSerializer.Deserialize<Forecast>(forecastJson);
            Console.WriteLine(forecastObj);
        }
    }
}

// Produces output like the following example:
//
//{ "Date":"2020-10-21T15:26:10.5044594-07:00","TemperatureC":40,"Summary":"Hot!"}
//Forecast { Date = 10 / 21 / 2020 3:26:10 PM, TemperatureC = 40, Summary = Hot! }

Az attribútumok bármelyikét alkalmazhatja a tulajdonságnevekre az property: attribútumon lévő cél használatával. A pozíciórekordokról további információt a C# nyelvi referencia rekordjairól szóló cikkben talál.

Nem nyilvános tagok és vagyoni kellékek

A tulajdonságon nem nyilvános tartozék használatát a [JsonInclude] attribútummal engedélyezheti, ahogyan az alábbi példában látható:

using System.Text.Json;
using System.Text.Json.Serialization;

namespace NonPublicAccessors
{
    public class Forecast
    {
        public DateTime Date { get; init; }

        [JsonInclude]
        public int TemperatureC { get; private set; }

        [JsonInclude]
        public string? Summary { private get; set; }
    };

    public class Program
    {
        public static void Main()
        {
            string json = """
                {
                    "Date":"2020-10-23T09:51:03.8702889-07:00",
                    "TemperatureC":40,
                    "Summary":"Hot"
                }
                """;
            Console.WriteLine($"Input JSON: {json}");

            Forecast forecastDeserialized = JsonSerializer.Deserialize<Forecast>(json)!;
            Console.WriteLine($"Date: {forecastDeserialized.Date}");
            Console.WriteLine($"TemperatureC: {forecastDeserialized.TemperatureC}");

            json = JsonSerializer.Serialize<Forecast>(forecastDeserialized);
            Console.WriteLine($"Output JSON: {json}");
        }
    }
}

// Produces output like the following example:
//
//Input JSON: { "Date":"2020-10-23T09:51:03.8702889-07:00","TemperatureC":40,"Summary":"Hot"}
//Date: 10 / 23 / 2020 9:51:03 AM
//TemperatureC: 40
//Output JSON: { "Date":"2020-10-23T09:51:03.8702889-07:00","TemperatureC":40,"Summary":"Hot"}
Imports System.Text.Json
Imports System.Text.Json.Serialization

Namespace NonPublicAccessors

    Public Class Forecast
        Public Property [Date] As Date

        Private _temperatureC As Integer

        <JsonInclude>
        Public Property TemperatureC As Integer
            Get
                Return _temperatureC
            End Get
            Private Set(Value As Integer)
                _temperatureC = Value
            End Set
        End Property

        Private _summary As String

        <JsonInclude>
        Public Property Summary As String
            Private Get
                Return _summary
            End Get
            Set(Value As String)
                _summary = Value
            End Set
        End Property

    End Class

    Public NotInheritable Class Program

        Public Shared Sub Main()
            Dim json As String = "{""Date"":""2020-10-23T09:51:03.8702889-07:00"",""TemperatureC"":40,""Summary"":""Hot""}"
            Console.WriteLine($"Input JSON: {json}")

            Dim forecastDeserialized As Forecast = JsonSerializer.Deserialize(Of Forecast)(json)
            Console.WriteLine($"Date: {forecastDeserialized.[Date]}")
            Console.WriteLine($"TemperatureC: {forecastDeserialized.TemperatureC}")

            json = JsonSerializer.Serialize(forecastDeserialized)
            Console.WriteLine($"Output JSON: {json}")
        End Sub

    End Class

End Namespace

' Produces output like the following example:
'
'Input JSON: { "Date":"2020-10-23T09:51:03.8702889-07:00","TemperatureC":40,"Summary":"Hot"}
'Date: 10 / 23 / 2020 9:51:03 AM
'TemperatureC: 40
'Output JSON: { "Date":"2020-10-23T09:51:03.8702889-07:00","TemperatureC":40,"Summary":"Hot"}

Ha egy tulajdonságot magángéppel is felvesz, akkor is deszerializálhatja a tulajdonságot.

A .NET 8-es és újabb verzióiban a [JsonInclude] attribútummal nem nyilvános tagokat is választhat egy adott típus szerializálási szerződésébe.

Feljegyzés

Forrásgenerációs módban nem szerializálhatja private a tagokat, és nem használhat private kiegészítőket úgy, hogy a [JsonInclude] attribútummal jegyzeteli őket. És csak akkor szerializálhatja internal a tagokat, vagy használhat internal tartozékokat, ha ugyanabban a szerelvényben vannak, mint a létrehozott JsonSerializerContext.

Csak olvasható tulajdonságok

A .NET 8 és újabb verzióiban az írásvédett tulajdonságok vagy azok, amelyek nem rendelkeznek beállítóval sem privát, sem nyilvános, deszerializálhatók is. Bár nem módosíthatja a tulajdonság által hivatkozott példányt, ha a tulajdonság típusa nem módosítható, módosíthatja. Hozzáadhat például egy elemet egy listához. Az írásvédett tulajdonság deszerializálásához az objektumlétrehozás kezelési viselkedését a csere helyett be kell állítania. Megjegyzést fűzhet például a tulajdonsághoz az JsonObjectCreationHandlingAttribute attribútummal.

class A
{
    [JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]
    public List<int> Numbers1 { get; } = new List<int>() { 1, 2, 3 };
}

További információ: Inicializált tulajdonságok feltöltése.

Lásd még