İçinde kaynak oluşturmayı kullanma System.Text.Json
Bu makalede, uygulamasının kaynak oluşturma özelliklerinin nasıl kullanılacağı gösterilmektedir System.Text.Json .
Kaynak oluşturmayı ' de kullanma hakkında daha fazla bilgi için System.Text.Json Bu makalenin .net 6 sürümünebakın.
Kaynak oluşturma varsayılanlarını kullan
Kaynak oluşturmayı tüm varsayılanlar ile kullanmak için (her iki mod, varsayılan seçenek):
- Öğesinden türetilen kısmi bir sınıf oluşturun JsonSerializerContext .
- Bağlam sınıfına uygulayarak seri hale getirilecek veya seri durumdan çıkarılacak türü belirtin JsonSerializableAttribute .
- JsonSerializerÖrnek alan bir yöntemi çağırın JsonTypeInfo<T> . Alternatif bir JsonSerializer örnek alan bir yöntemi çağırmayın JsonSerializerContext .
Varsayılan olarak, bir tane belirtmezseniz, kaynak oluşturma modlarını her ikisi de kullanılır. Kullanılacak modu belirtme hakkında daha fazla bilgi için bu makalenin ilerleyen kısımlarında kaynak oluşturma modunu belirtin bölümüne bakın.
Aşağıdaki örneklerde kullanılan tür aşağıdadır:
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
Önceki sınıf için kaynak oluşturmak üzere yapılandırılan bağlam sınıfı aşağıda verilmiştir WeatherForecast :
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(WeatherForecast))]
internal partial class SourceGenerationContext : JsonSerializerContext
{
}
JsonSerializer kaynak oluşturma kullanan Yöntemler
Aşağıdaki örnekler, serileştirilmeyen yöntemleri çağırır:
jsonString = JsonSerializer.Serialize(
weatherForecast!, SourceGenerationContext.Default.WeatherForecast);
jsonString = JsonSerializer.Serialize(
weatherForecast, typeof(WeatherForecast), SourceGenerationContext.Default);
Aşağıdaki örnekler, seri durumdan çıkarılacak yöntemleri çağırır:
weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(
jsonString, SourceGenerationContext.Default.WeatherForecast);
weatherForecast = JsonSerializer.Deserialize(
jsonString, typeof(WeatherForecast), SourceGenerationContext.Default)
as WeatherForecast;
Önceki örneklerde, Default bağlam türünün statik özelliği, varsayılan seçeneklerle bağlam türünün bir örneğini sağlar. Bağlam örneği WeatherForecast bir örnek döndüren bir özellik sağlar JsonTypeInfo<WeatherForecast> . Özniteliğin özelliğini kullanarak bu özellik için farklı bir ad belirtebilirsiniz TypeInfoPropertyName [JsonSerializable] .
Tüm program örneği
Aşağıda, tüm bir programdaki önceki örnekler verilmiştir:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace BothModesNoOptions
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(WeatherForecast))]
internal partial class SourceGenerationContext : JsonSerializerContext
{
}
public class Program
{
public static void Main()
{
string jsonString =
@"{
""Date"": ""2019-08-01T00:00:00"",
""TemperatureCelsius"": 25,
""Summary"": ""Hot""
}
";
WeatherForecast? weatherForecast;
weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(
jsonString, SourceGenerationContext.Default.WeatherForecast);
Console.WriteLine($"Date={weatherForecast?.Date}");
// output:
//Date=8/1/2019 12:00:00 AM
weatherForecast = JsonSerializer.Deserialize(
jsonString, typeof(WeatherForecast), SourceGenerationContext.Default)
as WeatherForecast;
Console.WriteLine($"Date={weatherForecast?.Date}");
// output:
//Date=8/1/2019 12:00:00 AM
jsonString = JsonSerializer.Serialize(
weatherForecast!, SourceGenerationContext.Default.WeatherForecast);
Console.WriteLine(jsonString);
// output:
//{"Date":"2019-08-01T00:00:00","TemperatureCelsius":25,"Summary":"Hot"}
jsonString = JsonSerializer.Serialize(
weatherForecast, typeof(WeatherForecast), SourceGenerationContext.Default);
Console.WriteLine(jsonString);
// output:
//{"Date":"2019-08-01T00:00:00","TemperatureCelsius":25,"Summary":"Hot"}
}
}
}
Kaynak oluşturma modunu belirtin
Tüm bağlam için meta veri toplama modunu veya serileştirme iyileştirme modunu belirtebilir ve bu birden çok tür içerebilir. Ya da tek bir türün modunu belirtebilirsiniz. Her ikisini de yaparsanız, bir tür için mod belirtimi kazanır.
- Tüm bağlam için
GenerationModeözelliğini kullanınJsonSourceGenerationOptionsAttribute. - Tek bir tür için, özelliğini kullanın GenerationMode JsonSerializableAttribute .
Serileştirme iyileştirme modu örneği
Tüm bağlam için:
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Serialization)] [JsonSerializable(typeof(WeatherForecast))] internal partial class SerializeOnlyContext : JsonSerializerContext { }Tek bir tür için:
[JsonSerializable(typeof(WeatherForecast), GenerationMode = JsonSourceGenerationMode.Serialization)] internal partial class SerializeOnlyWeatherForecastOnlyContext : JsonSerializerContext { }Tüm program örneği
using System.Text.Json; using System.Text.Json.Serialization; namespace SerializeOnlyNoOptions { public class WeatherForecast { public DateTime Date { get; set; } public int TemperatureCelsius { get; set; } public string? Summary { get; set; } } [JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Serialization)] [JsonSerializable(typeof(WeatherForecast))] internal partial class SerializeOnlyContext : JsonSerializerContext { } [JsonSerializable(typeof(WeatherForecast), GenerationMode = JsonSourceGenerationMode.Serialization)] internal partial class SerializeOnlyWeatherForecastOnlyContext : JsonSerializerContext { } public class Program { public static void Main() { string jsonString; WeatherForecast weatherForecast = new() { Date = DateTime.Parse("2019-08-01"), TemperatureCelsius = 25, Summary = "Hot" }; // Use context that selects Serialization mode only for WeatherForecast. jsonString = JsonSerializer.Serialize(weatherForecast, SerializeOnlyWeatherForecastOnlyContext.Default.WeatherForecast); Console.WriteLine(jsonString); // output: //{"Date":"2019-08-01T00:00:00","TemperatureCelsius":25,"Summary":"Hot"} // Use a context that selects Serialization mode. jsonString = JsonSerializer.Serialize(weatherForecast, SerializeOnlyContext.Default.WeatherForecast); Console.WriteLine(jsonString); // output: //{"Date":"2019-08-01T00:00:00","TemperatureCelsius":25,"Summary":"Hot"} } } }
Meta veri toplama modu örneği
Tüm bağlam için:
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] [JsonSerializable(typeof(WeatherForecast))] internal partial class MetadataOnlyContext : JsonSerializerContext { }jsonString = JsonSerializer.Serialize( weatherForecast!, MetadataOnlyContext.Default.WeatherForecast);weatherForecast = JsonSerializer.Deserialize<WeatherForecast>( jsonString, MetadataOnlyContext.Default.WeatherForecast);Tek bir tür için:
[JsonSerializable(typeof(WeatherForecast), GenerationMode = JsonSourceGenerationMode.Metadata)] internal partial class MetadataOnlyWeatherForecastOnlyContext : JsonSerializerContext { }jsonString = JsonSerializer.Serialize( weatherForecast!, MetadataOnlyWeatherForecastOnlyContext.Default.WeatherForecast);weatherForecast = JsonSerializer.Deserialize<WeatherForecast>( jsonString, MetadataOnlyWeatherForecastOnlyContext.Default.WeatherForecast);Tüm program örneği
using System.Text.Json; using System.Text.Json.Serialization; namespace MetadataOnlyNoOptions { public class WeatherForecast { public DateTime Date { get; set; } public int TemperatureCelsius { get; set; } public string? Summary { get; set; } } [JsonSerializable(typeof(WeatherForecast), GenerationMode = JsonSourceGenerationMode.Metadata)] internal partial class MetadataOnlyWeatherForecastOnlyContext : JsonSerializerContext { } [JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] [JsonSerializable(typeof(WeatherForecast))] internal partial class MetadataOnlyContext : JsonSerializerContext { } public class Program { public static void Main() { string jsonString = @"{ ""Date"": ""2019-08-01T00:00:00"", ""TemperatureCelsius"": 25, ""Summary"": ""Hot"" } "; WeatherForecast? weatherForecast; // Deserialize with context that selects metadata mode only for WeatherForecast only. weatherForecast = JsonSerializer.Deserialize<WeatherForecast>( jsonString, MetadataOnlyWeatherForecastOnlyContext.Default.WeatherForecast); Console.WriteLine($"Date={weatherForecast?.Date}"); // output: //Date=8/1/2019 12:00:00 AM // Serialize with context that selects metadata mode only for WeatherForecast only. jsonString = JsonSerializer.Serialize( weatherForecast!, MetadataOnlyWeatherForecastOnlyContext.Default.WeatherForecast); Console.WriteLine(jsonString); // output: //{"Date":"2019-08-01T00:00:00","TemperatureCelsius":25,"Summary":"Hot"} // Deserialize with context that selects metadata mode only. weatherForecast = JsonSerializer.Deserialize<WeatherForecast>( jsonString, MetadataOnlyContext.Default.WeatherForecast); Console.WriteLine($"Date={weatherForecast?.Date}"); // output: //Date=8/1/2019 12:00:00 AM // Serialize with context that selects metadata mode only. jsonString = JsonSerializer.Serialize( weatherForecast!, MetadataOnlyContext.Default.WeatherForecast); Console.WriteLine(jsonString); // output: //{"Date":"2019-08-01T00:00:00","TemperatureCelsius":0,"Summary":"Hot"} } } }
Serileştirme iyileştirme modu için seçenekleri belirtin
JsonSourceGenerationOptionsAttributeSerileştirme iyileştirme modu tarafından desteklenen seçenekleri belirtmek için kullanın. Koda geri dönüş olmadan bu seçenekleri kullanabilirsiniz JsonSerializer . Örneğin, WriteIndented ve CamelCase desteklenir:
[JsonSourceGenerationOptions(
WriteIndented = true,
PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
GenerationMode = JsonSourceGenerationMode.Serialization)]
[JsonSerializable(typeof(WeatherForecast))]
internal partial class SerializationModeOptionsContext : JsonSerializerContext
{
}
JsonSourceGenerationOptionsAttributeSerileştirme seçeneklerini belirtmek için kullanırken, aşağıdaki serileştirme yöntemlerinden birini çağırın:
JsonSerializer.SerializeAlan bir yöntemiTypeInfo<TValue>.Default.<TypeName>Bağlam sınıfınızın özelliği geçirin:jsonString = JsonSerializer.Serialize( weatherForecast, SerializationModeOptionsContext.Default.WeatherForecast);JsonSerializer.SerializeBağlam alan bir yöntem.DefaultBağlam sınıfınızın statik özelliğini geçirin.jsonString = JsonSerializer.Serialize( weatherForecast, typeof(WeatherForecast), SerializationModeOptionsContext.Default);
Kendi Örneğinizde geçiş yapmanızı sağlayan bir yöntemi çağırırsanız Utf8JsonWriter , Indented seçeneğinin yerine yazıcının ayarı kabul edilir JsonSourceGenerationOptionsAttribute.WriteIndented .
Bir örneği alan oluşturucuyu çağırarak bir bağlam örneği oluşturup kullanırsanız JsonSerializerOptions , sağlanan örnek tarafından belirtilen seçenekler yerine kullanılacaktır JsonSourceGenerationOptionsAttribute .
Aşağıda, tüm bir programdaki önceki örnekler verilmiştir:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SerializeOnlyWithOptions
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
[JsonSourceGenerationOptions(
WriteIndented = true,
PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
GenerationMode = JsonSourceGenerationMode.Serialization)]
[JsonSerializable(typeof(WeatherForecast))]
internal partial class SerializationModeOptionsContext : JsonSerializerContext
{
}
public class Program
{
public static void Main()
{
string jsonString;
WeatherForecast weatherForecast = new()
{ Date = DateTime.Parse("2019-08-01"), TemperatureCelsius = 25, Summary = "Hot" };
// Serialize using TypeInfo<TValue> provided by the context
// and options specified by [JsonSourceGenerationOptions].
jsonString = JsonSerializer.Serialize(
weatherForecast, SerializationModeOptionsContext.Default.WeatherForecast);
Console.WriteLine(jsonString);
// output:
//{
// "date": "2019-08-01T00:00:00",
// "temperatureCelsius": 0,
// "summary": "Hot"
//}
// Serialize using Default context
// and options specified by [JsonSourceGenerationOptions].
jsonString = JsonSerializer.Serialize(
weatherForecast, typeof(WeatherForecast), SerializationModeOptionsContext.Default);
Console.WriteLine(jsonString);
// output:
//{
// "date": "2019-08-01T00:00:00",
// "temperatureCelsius": 0,
// "summary": "Hot"
//}
}
}
}
Kullanarak seçenekleri belirtin JsonSerializerOptions
Bazı seçenekleri JsonSerializerOptions serileştirme iyileştirme modu tarafından desteklenmez. Bu seçenekler, kaynak tarafından oluşturulan koda geri dönüş yapılmasına neden olur JsonSerializer . Daha fazla bilgi için bkz. serileştirme iyileştirmesi.
Kullanarak seçenekleri belirtmek için JsonSerializerOptions :
JsonSerializerOptionsörneği oluşturun.- Sınıfından türetilen JsonSerializerContext ve örneği oluşturucuya geçiren bir örnek oluşturun
JsonSerializerOptions. - Bağlam örneği veya alma işlemi için çağrı serileştirme veya serisini kaldırma yöntemleri
JsonSerializerTypeInfo<TValue>.
Örnek bir bağlam sınıfı aşağıda, serileştirme ve serisini kaldırma örnek kodu aşağıda verilmiştir:
[JsonSerializable(typeof(WeatherForecast))]
internal partial class OptionsExampleContext : JsonSerializerContext
{
}
jsonString = JsonSerializer.Serialize(
weatherForecast,
typeof(WeatherForecast),
new OptionsExampleContext(
new JsonSerializerOptions(JsonSerializerDefaults.Web)));
weatherForecast = JsonSerializer.Deserialize(
jsonString,
typeof(WeatherForecast),
new OptionsExampleContext(
new JsonSerializerOptions(JsonSerializerDefaults.Web)))
as WeatherForecast;
Aşağıda, tüm bir programdaki önceki örnekler verilmiştir:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace JsonSerializerOptionsExample
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
[JsonSerializable(typeof(WeatherForecast))]
internal partial class OptionsExampleContext : JsonSerializerContext
{
}
public class Program
{
public static void Main()
{
string jsonString =
@"{
""date"": ""2019-08-01T00:00:00"",
""temperatureCelsius"": 25,
""summary"": ""Hot""
}
";
WeatherForecast? weatherForecast;
weatherForecast = JsonSerializer.Deserialize(
jsonString,
typeof(WeatherForecast),
new OptionsExampleContext(
new JsonSerializerOptions(JsonSerializerDefaults.Web)))
as WeatherForecast;
Console.WriteLine($"Date={weatherForecast?.Date}");
// output:
//Date=8/1/2019 12:00:00 AM
jsonString = JsonSerializer.Serialize(
weatherForecast,
typeof(WeatherForecast),
new OptionsExampleContext(
new JsonSerializerOptions(JsonSerializerDefaults.Web)));
Console.WriteLine(jsonString);
// output:
//{ "date":"2019-08-01T00:00:00","temperatureCelsius":25,"summary":"Hot"}
}
}
}
ASP.NET Core 'de kaynak oluşturma desteği
Blazor uygulamalarında:
HttpClientJsonExtensions.GetFromJsonAsync HttpClientJsonExtensions.PostAsJsonAsync Kaynak oluşturma bağlamını veya bir kaynak oluşturma bağlamını alan uzantı yöntemlerinin aşırı yüklerini kullanın
TypeInfo<TValue>.Razor Pages, MVC, SignalR ve Web API uygulamalarında:
AddContext JsonSerializerOptions Aşağıdaki örnekte gösterildiği gibi yöntemini kullanın:
[JsonSerializable(typeof(WeatherForecast[]))] internal partial class MyJsonContext : JsonSerializerContext { }services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.AddContext<MyJsonContext>());
Ayrıca bkz.
- Yeni System.Text.Json kaynak oluşturucuyu deneyin
- .NET 'te JSON serileştirme ve serisini kaldırma-genel bakış
- Kitaplığı kullanma
- JsonSerializerOptions örneklerinin örneğini oluşturma
- Büyük/küçük harf duyarlı eşlemeyi etkinleştirme
- Özellik adlarını ve değerlerini özelleştirme
- Özellikleri yoksayma
- Geçersiz JSON’a izin verme
- Taşma JSON 'ı veya JsonElement veya JsonNode kullanın
- Başvuruları koru ve döngüsel başvuruları işle
- Sabit türler ve genel olmayan erişimciler için seri durumdan çıkarma
- Polimorfik serileştirme
- Newtonsoft. JSON öğesinden öğesine geçirin System.Text.Json
- Karakter kodlamasını özelleştirme
- DOM, Utf8JsonReader ve Utf8JsonWriter kullanma
- JSON serileştirme için özel dönüştürücüler yazma
- DateTime ve DateTimeOffset desteği
- İçinde desteklenen koleksiyon türleri System.Text.Json
- System.Text.Json API başvurusu
- System.Text.Json. Serileştirme API başvurusu