Sabit türleri ve özellikleri kullanma
Sabit tür, bir nesnenin örneğini oluşturduktan sonra herhangi bir özellik veya alan değerini değiştirmenizi engelleyen türdür . Tür bir kayıt olabilir, ortak özellikleri veya alanları olmayabilir, salt okunur özelliklere veya özel veya yalnızca başlatma ayarlayıcılarına sahip özelliklere sahip olabilir. System.String sabit bir tür örneğidir. System.Text.Json JSON'ı sabit türler olarak seri durumdan çıkarmanın farklı yollarını sağlar.
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 örnekte özniteliği kullanılır
[JsonConstructor]
: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 = 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 özniteliği
[JsonConstructor]
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, özelliğin TemperatureC
adı JSON'da olarak değiştirilmiştir celsius
, ancak oluşturucu parametresi hala olarak adlandırılmıştır temperatureC
:
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 = 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]
Ayrıca, 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 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! }
Özniteliklerdeki hedefi kullanarak property:
özniteliklerden herhangi birini özellik adlarına uygulayabilirsiniz. Konumsal kayıtlar hakkında daha fazla bilgi için C# dil başvurusundaki kayıtlara ilişkin makaleye 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 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"}
Özel ayarlayıcıya sahip bir özellik ekleyerek, yine de bu özelliği seri durumdan çıkarabilirsiniz.
.NET 8 ve sonraki sürümlerde, [JsonInclude] özniteliğini kullanarak genel olmayan üyeleri belirli bir tür için serileştirme sözleşmesine kabul edebilirsiniz.
Not
Kaynak oluşturma modunda üyeleri seri hale private
getiremez veya [JsonInclude] özniteliğiyle ek açıklama ekleyerek erişimcileri kullanamazsınızprivate
. Ayrıca üyeleri yalnızca oluşturulan JsonSerializerContextile aynı derlemedeyse serileştirebilir internal
veya erişimcileri kullanabilirsinizinternal
.
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ı değiştirmek yerine doldurulacak şekilde ayarlamanız gerekir. Örneğin, özniteliğiyle özelliğine JsonObjectCreationHandlingAttribute açıklama ekleyebilirsiniz.
class A
{
[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]
public List<int> Numbers1 { get; } = new List<int>() { 1, 2, 3 };
}
Daha fazla bilgi için bkz . Başlatılan özellikleri doldurma.