Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Değişmez türü, bir nesne örneklendikten sonra herhangi bir özellik veya alan değerinin değişmesine izin vermeyen bir türdür. Tür bir kayıt olabilir, genel özellikleri veya alanları olmayabilir, salt okunur özelliklere veya özel ya da yalnızca başlatılırken ayarlanabilen ayarlayıcılara sahip özelliklere sahip olabilir. System.String sabit bir tür örneğidir. System.Text.Json, JSON'u değişmez türlere nasıl seri durumdan çıkarabileceğiniz konusunda size farklı yollar sunar.
Parametreli oluşturucular
Varsayılan olarak, System.Text.Json varsayılan genel parametresiz oluşturucuyu kullanır. Ancak, sabit bir sınıfın veya yapının seri durumdan çıkarılmasına olanak tanıyan parametreli bir oluşturucu kullanmasını söyleyebilirsiniz.
Bir sınıf için, tek oluşturucu parametreli bir oluşturucu ise, bu oluşturucu kullanılır.
Bir yapı veya birden çok oluşturucuya sahip bir sınıf için, [JsonConstructor] özniteliğini uygulayarak kullanılacak olanı belirtin. Öznitelik kullanılmadığında, varsa her zaman genel parametresiz bir oluşturucu kullanılır.
Aşağıdaki örnek
[JsonConstructor]özniteliğini kullanır: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 Run() { string json = """ { "date":"2020-09-06T11:31:01.923395-07:00", "temperatureC":-1, "summary":"Cold" } """; Console.WriteLine($"Input JSON: {json}"); var options = JsonSerializerOptions.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 forecast1 As Forecast = JsonSerializer.Deserialize(Of Forecast)(json, JsonSerializerOptions.Web) 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, JsonSerializerOptions.Web) 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"}.NET 7 ve önceki sürümlerinde,
[JsonConstructor]özniteliği yalnızca ortak oluşturucularla kullanılabilir.
Parametreli bir oluşturucunun parametre adları özellik adları ve türleriyle eşleşmelidir. Eşleştirme büyük/küçük harfe duyarlı değildir ve bir özelliği yeniden adlandırmak için [JsonPropertyName] kullansanız bile oluşturucu parametresinin gerçek özellik adıyla eşleşmesi gerekir. Aşağıdaki örnekte, TemperatureC özelliğinin adı JSON'da celsius olarak değiştirilmiştir, ancak oluşturucu parametresi hala temperatureColarak adlandırılmıştır:
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 Run()
{
string json = """
{
"date":"2020-09-06T11:31:01.923395-07:00",
"celsius":-1,
"summary":"Cold"
}
""";
Console.WriteLine($"Input JSON: {json}");
var options = JsonSerializerOptions.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]yanı sıra, aşağıdaki öznitelikler parametreli oluşturucularla seri durumdan çıkarma özelliğini destekler:
Kayıtlar
Kayıtlar, aşağıdaki örnekte gösterildiği gibi hem serileştirme hem de seri durumdan çıkarma için de desteklenir:
using System.Text.Json;
namespace Records
{
public record Forecast(DateTime Date, int TemperatureC)
{
public string? Summary { get; init; }
};
public class Program
{
public static void Run()
{
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! }
Öznitelik üzerindeki property: hedefini kullanarak özniteliklerden herhangi birini özellik adlarına uygulayabilirsiniz. Konumsal kayıtlar hakkında daha fazla bilgi için C# dil referansındaki kayıtları makalesine bakın.
Genel olmayan üyeler ve özellik erişimcileri
Aşağıdaki örnekte gösterildiği gibi [JsonInclude] özniteliğini kullanarak bir özellikte genel olmayan erişimci kullanımını etkinleştirebilirsiniz:
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 Run()
{
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"}
Özel ayarlayıcıya sahip bir özellik ekleyerek, yine de bu özelliği seri durumdan çıkarabilirsiniz.
.NET 8 ve sonraki sürümlerinde, belirli bir tür için serileştirme sözleşmesine genel olmayan üyelerini seçmek için [JsonInclude] özniteliğini de kullanabilirsiniz.
Not
Kaynak oluşturma modunda, private üyelerini veya private erişimcilerini [JsonInclude] özelliğiyle ek açıklama ekleyerek seri hale getiremez veya kullanamazsınız. Ayrıca, yalnızca oluşturulan internalile aynı derlemede olan internal üyelerini serileştirebilir veya JsonSerializerContext erişimcilerini kullanabilirsiniz.
Salt okunur özellikler
.NET 8 ve sonraki sürümlerde salt okunur özellikler veya özel veya genel ayarlayıcı içermeyenler de seri durumdan çıkarılabilir. Özelliğin başvurduğunu örneği değiştiremezsiniz, ancak özelliğin türü değişebilirse değiştirebilirsiniz. Örneğin, bir öğeyi listeye ekleyebilirsiniz. Salt okunur bir özelliği seri durumdan çıkarmak için nesne oluşturma işleme davranışını yerine doldurmakayarlamanız gerekir. Örneğin, JsonObjectCreationHandlingAttribute özniteliğiyle özelliğine açıklama ekleyebilirsiniz.
class A
{
[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]
public List<int> Numbers1 { get; } = new List<int>() { 1, 2, 3 };
}
Daha fazla bilgi için, Başlatılan Özellikleri Doldurmabölümüne bakın.
Ayrıca bkz.
- System.Text.Json genel bakış
- JSON serileştirme ve deserileştirme