Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini memperlihatkan kepada Anda cara menggunakan serialisasi yang didukung System.Text.Json generasi sumber di aplikasi Anda.
Untuk informasi tentang berbagai mode pembuatan sumber, lihat Mode pembuatan sumber.
Menggunakan default pembuatan sumber
Untuk menggunakan pembuatan sumber dengan semua default (kedua mode, opsi default):
Membuat kelas yang berasal dari JsonSerializerContext.
Tentukan jenis yang akan diserialisasikan atau deserialisasikan dengan menerapkan JsonSerializableAttribute ke kelas konteks.
JsonSerializer Panggil metode yang:
- JsonTypeInfo<T> Mengambil instans, atau
- JsonSerializerContext Mengambil instans, atau
- Tentukan sebuah instans JsonSerializerOptions dan Anda telah mengatur propertinya JsonSerializerOptions.TypeInfoResolver ke properti
Defaultdari jenis konteks.
Secara default, kedua mode pembuatan sumber (pengoptimalanberbasis metadata dan serialisasi) digunakan jika Anda tidak menentukannya. Untuk informasi tentang cara menentukan mode yang akan digunakan, lihat Menentukan mode pembuatan sumber nanti di artikel ini.
Berikut adalah jenis yang digunakan dalam contoh berikut:
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
}
Berikut adalah kelas konteks yang dikonfigurasi untuk menghasilkan sumber untuk kelas sebelumnya WeatherForecast :
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(WeatherForecast))]
internal partial class SourceGenerationContext : JsonSerializerContext { }
Jenis WeatherForecast anggota tidak perlu ditentukan secara eksplisit dengan [JsonSerializable] atribut. Anggota yang dinyatakan sebagai object pengecualian untuk aturan ini. Jenis runtime bahasa umum untuk anggota yang dinyatakan perlu object ditentukan. Misalnya, Anda memiliki kode berikut:
public class WeatherForecast
{
public object? Data { get; set; }
public List<object>? DataList { get; set; }
}
Dan Anda tahu bahwa mungkin ada objek boolean dan int pada runtime.
WeatherForecast wf = new() { Data = true, DataList = [true, 1] };
Kemudian boolean dan int harus dinyatakan sebagai [JsonSerializable]:
[JsonSerializable(typeof(WeatherForecast))]
[JsonSerializable(typeof(bool))]
[JsonSerializable(typeof(int))]
public partial class WeatherForecastContext : JsonSerializerContext
{
}
Untuk menentukan pembuatan sumber untuk koleksi, gunakan [JsonSerializable] dengan jenis koleksi. Misalnya: [JsonSerializable(typeof(List<WeatherForecast>))].
JsonSerializer metode yang menggunakan pembuatan sumber
Dalam contoh berikut, properti statis Default dari jenis konteks menyediakan instans jenis konteks dengan opsi default. Instans konteks menyediakan WeatherForecast properti yang mengembalikan instans JsonTypeInfo<WeatherForecast>. Anda dapat menentukan nama yang berbeda untuk properti ini dengan menggunakan TypeInfoPropertyName properti dari [JsonSerializable] atribut .
Contoh serialisasi
Menggunakan JsonTypeInfo<T>:
jsonString = JsonSerializer.Serialize(
weatherForecast!, SourceGenerationContext.Default.WeatherForecast);
Menggunakan JsonSerializerContext:
jsonString = JsonSerializer.Serialize(
weatherForecast, typeof(WeatherForecast), SourceGenerationContext.Default);
Menggunakan JsonSerializerOptions:
sourceGenOptions = new JsonSerializerOptions
{
TypeInfoResolver = SourceGenerationContext.Default
};
jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast, sourceGenOptions);
Contoh deserialisasi
Menggunakan JsonTypeInfo<T>:
weatherForecast = JsonSerializer.Deserialize(
jsonString, SourceGenerationContext.Default.WeatherForecast);
Menggunakan JsonSerializerContext:
weatherForecast = JsonSerializer.Deserialize(
jsonString, typeof(WeatherForecast), SourceGenerationContext.Default)
as WeatherForecast;
Menggunakan JsonSerializerOptions:
var sourceGenOptions = new JsonSerializerOptions
{
TypeInfoResolver = SourceGenerationContext.Default
};
weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString, sourceGenOptions);
Contoh program lengkap
Berikut adalah contoh sebelumnya dalam program lengkap:
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(
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
var sourceGenOptions = new JsonSerializerOptions
{
TypeInfoResolver = SourceGenerationContext.Default
};
weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString, sourceGenOptions);
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"}
sourceGenOptions = new JsonSerializerOptions
{
TypeInfoResolver = SourceGenerationContext.Default
};
jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast, sourceGenOptions);
Console.WriteLine(jsonString);
// output:
//{"Date":"2019-08-01T00:00:00","TemperatureCelsius":25,"Summary":"Hot"}
}
}
}
Tentukan mode pembuatan sumber
Anda dapat menentukan mode berbasis metadata atau mode pengoptimalan serialisasi untuk seluruh konteks, yang mungkin mencakup beberapa jenis. Atau Anda dapat menentukan mode untuk jenis individual. Jika Anda melakukan keduanya, spesifikasi mode untuk jenis menang.
- Untuk seluruh konteks, gunakan JsonSourceGenerationOptionsAttribute.GenerationMode properti.
- Untuk jenis individu, gunakan JsonSerializableAttribute.GenerationMode properti.
Contoh mode pengoptimalan serialisasi (jalur cepat)
Untuk seluruh konteks:
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Serialization)] [JsonSerializable(typeof(WeatherForecast))] internal partial class SerializeOnlyContext : JsonSerializerContext { }Untuk jenis individu:
[JsonSerializable(typeof(WeatherForecast), GenerationMode = JsonSourceGenerationMode.Serialization)] internal partial class SerializeOnlyWeatherForecastOnlyContext : JsonSerializerContext { }Contoh program lengkap
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"} } } }
Contoh mode berbasis metadata
Untuk seluruh konteks:
[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);Untuk jenis individu:
[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);Contoh program lengkap
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":25,"Summary":"Hot"} } } }
Dukungan pembuatan sumber di ASP.NET Core
Di aplikasi Blazor, gunakan kelebihan beban HttpClientJsonExtensions.GetFromJsonAsync metode ekstensi dan HttpClientJsonExtensions.PostAsJsonAsync yang mengambil konteks pembuatan sumber atau TypeInfo<TValue>.
Dimulai dengan .NET 8, Anda juga dapat menggunakan kelebihan beban HttpClientJsonExtensions.GetFromJsonAsAsyncEnumerable metode ekstensi yang menerima konteks pembuatan sumber atau TypeInfo<TValue>.
Di aplikasi Razor Pages, MVC, SignalR, dan Web API, gunakan JsonSerializerOptions.TypeInfoResolver properti untuk menentukan konteksnya.
[JsonSerializable(typeof(WeatherForecast[]))]
internal partial class MyJsonContext : JsonSerializerContext { }
var serializerOptions = new JsonSerializerOptions
{
TypeInfoResolver = MyJsonContext.Default
};
services.AddControllers().AddJsonOptions(
static options =>
options.JsonSerializerOptions.TypeInfoResolverChain.Add(MyJsonContext.Default));
Catatan
JsonSourceGenerationMode.Serialization, atau serialisasi jalur cepat , tidak didukung untuk serialisasi asinkron. Meskipun serialisasi streaming memerlukan model berbasis metadata, ia kembali ke jalur cepat jika payload diketahui cukup kecil agar pas dalam ukuran buffer yang telah ditentukan. Untuk informasi selengkapnya, lihat https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/#json .
Nonaktifkan default pantulan
Karena System.Text.Json menggunakan refleksi secara default, memanggil metode serialisasi dasar dapat merusak aplikasi AOT Asli, yang tidak mendukung semua API refleksi yang diperlukan. Jeda ini dapat menantang untuk didiagnosis karena dapat tidak dapat diprediksi, dan aplikasi sering di-debug menggunakan runtime CoreCLR, di mana refleksi berfungsi. Sebaliknya, jika Anda secara eksplisit menonaktifkan serialisasi berbasis refleksi, jeda lebih mudah didiagnosis. Kode yang menggunakan serialisasi berbasis refleksi akan menyebabkan InvalidOperationException muncul dengan pesan deskriptif saat runtime.
Untuk menonaktifkan refleksi default di aplikasi Anda, atur JsonSerializerIsReflectionEnabledByDefault properti MSBuild ke false dalam file proyek Anda:
<PropertyGroup>
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
</PropertyGroup>
- Perilaku properti ini konsisten terlepas dari runtime, baik CoreCLR atau Native AOT.
- Jika Anda tidak menentukan properti ini dan PublishTrimmed diaktifkan, serialisasi berbasis refleksi akan dinonaktifkan secara otomatis.
Anda dapat memeriksa secara terprogram apakah refleksi dinonaktifkan dengan menggunakan JsonSerializer.IsReflectionEnabledByDefault properti . Cuplikan kode berikut menunjukkan bagaimana Anda dapat mengonfigurasi serializer bergantung pada apakah pantulan diaktifkan:
static JsonSerializerOptions CreateDefaultOptions()
{
return new()
{
TypeInfoResolver = JsonSerializer.IsReflectionEnabledByDefault
? new DefaultJsonTypeInfoResolver()
: MyContext.Default
};
}
Karena properti diperlakukan sebagai konstanta waktu tautan, metode sebelumnya tidak mengakar resolver berbasis refleksi dalam aplikasi yang berjalan di Native AOT.
Menentukan opsi
Di .NET 8 dan versi yang lebih baru, sebagian besar opsi yang dapat Anda atur menggunakan JsonSerializerOptions juga dapat diatur menggunakan JsonSourceGenerationOptionsAttribute atribut . Keuntungan untuk mengatur opsi melalui atribut adalah bahwa konfigurasi ditentukan pada waktu kompilasi, yang memastikan bahwa properti yang dihasilkan MyContext.Default telah dikonfigurasi sebelumnya dengan semua opsi yang relevan yang ditetapkan.
Kode berikut menunjukkan cara mengatur opsi menggunakan JsonSourceGenerationOptionsAttribute atribut .
[JsonSourceGenerationOptions(
WriteIndented = true,
PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
GenerationMode = JsonSourceGenerationMode.Serialization)]
[JsonSerializable(typeof(WeatherForecast))]
internal partial class SerializationModeOptionsContext : JsonSerializerContext
{
}
Saat menggunakan JsonSourceGenerationOptionsAttribute untuk menentukan opsi serialisasi, panggil salah satu metode serialisasi berikut:
Metode
JsonSerializer.Serializeyang mengambilTypeInfo<TValue>. TeruskanDefault.<TypeName>properti kelas konteks Anda:jsonString = JsonSerializer.Serialize( weatherForecast, SerializationModeOptionsContext.Default.WeatherForecast);Metode
JsonSerializer.Serializeyang mengambil. Berikan propertiDefaultstatis kelas konteks Anda.jsonString = JsonSerializer.Serialize( weatherForecast, typeof(WeatherForecast), SerializationModeOptionsContext.Default);
Jika Anda memanggil metode yang memungkinkan Anda meneruskan instans Utf8JsonWriterAnda sendiri, pengaturan penulis Indented dihormati daripada JsonSourceGenerationOptionsAttribute.WriteIndented opsi.
Jika Anda membuat dan menggunakan instans konteks dengan memanggil konstruktor yang mengambil JsonSerializerOptions instans, instans yang disediakan akan digunakan bukan opsi yang ditentukan oleh JsonSourceGenerationOptionsAttribute.
Kode berikut menunjukkan contoh sebelumnya dalam program lengkap:
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"
//}
}
}
}
Menggabungkan generator sumber
Anda dapat menggabungkan kontrak dari beberapa konteks yang dihasilkan sumber di dalam satu JsonSerializerOptions instans. Gunakan properti untuk menautkan JsonSerializerOptions.TypeInfoResolver beberapa konteks yang telah digabungkan dengan menggunakan JsonTypeInfoResolver.Combine(IJsonTypeInfoResolver[]) metode .
var options = new JsonSerializerOptions
{
TypeInfoResolver = JsonTypeInfoResolver.Combine(ContextA.Default, ContextB.Default, ContextC.Default),
};
Mulai dari .NET 8, jika nanti Anda ingin menambahkan konteks lain sebelumnya atau menambahkan, Anda dapat melakukannya menggunakan JsonSerializerOptions.TypeInfoResolverChain properti . Pengurutan rantai signifikan: JsonSerializerOptions mengkueri setiap pemecah masalah dalam urutan yang ditentukan dan mengembalikan hasil pertama yang bukan null.
options.TypeInfoResolverChain.Add(ContextD.Default); // Append to the end of the list.
options.TypeInfoResolverChain.Insert(0, ContextE.Default); // Insert at the beginning of the list.
Setiap perubahan yang dilakukan pada TypeInfoResolverChain properti tercermin oleh TypeInfoResolver dan sebaliknya.
Menserialisasikan bidang enum sebagai string
Secara default, enum didukung sebagai angka. Untuk menserialisasikan bidang enum tertentu sebagai string saat menggunakan generasi sumber, anotasi dengan JsonStringEnumConverter<TEnum> pengonversi. Atau untuk mengatur kebijakan umum untuk semua enumerasi, gunakan atribut JsonSourceGenerationOptionsAttribute.
JsonStringEnumConverter<T> Converter
Untuk menserialisasikan nama enum sebagai string menggunakan pembuatan sumber, gunakan JsonStringEnumConverter<TEnum> pengonversi. (Jenis non-generik JsonStringEnumConverter tidak didukung oleh runtime AOT Asli.)
Anotasi jenis enumerasi dengan JsonStringEnumConverter<TEnum> pengonversi menggunakan JsonConverterAttribute atribut :
public class WeatherForecastWithPrecipEnum
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public Precipitation? Precipitation { get; set; }
}
[JsonConverter(typeof(JsonStringEnumConverter<Precipitation>))]
public enum Precipitation
{
Drizzle, Rain, Sleet, Hail, Snow
}
Buat JsonSerializerContext kelas dan anotasi dengan JsonSerializableAttribute atribut :
[JsonSerializable(typeof(WeatherForecastWithPrecipEnum))]
public partial class Context1 : JsonSerializerContext { }
Kode berikut menserialisasikan nama enum alih-alih nilai numerik:
var weatherForecast = new WeatherForecastWithPrecipEnum
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Precipitation = Precipitation.Sleet
};
var options = new JsonSerializerOptions
{
WriteIndented = true,
TypeInfoResolver = Context1.Default,
};
string? jsonString = JsonSerializer.Serialize(weatherForecast, options);
JSON yang dihasilkan terlihat seperti contoh berikut:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Precipitation": "Sleet"
}
Kebijakan selimut
Alih-alih menggunakan jenis , JsonStringEnumConverter<TEnum> Anda dapat menerapkan kebijakan selimut untuk membuat serial enum sebagai string dengan menggunakan JsonSourceGenerationOptionsAttribute. Buat JsonSerializerContext kelas dan anotasi dengan atribut JsonSerializableAttributedan JsonSourceGenerationOptionsAttribute :
[JsonSourceGenerationOptions(UseStringEnumConverter = true)]
[JsonSerializable(typeof(WeatherForecast2WithPrecipEnum))]
public partial class Context2 : JsonSerializerContext { }
Perhatikan bahwa enum tidak memiliki JsonConverterAttribute:
public class WeatherForecast2WithPrecipEnum
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public Precipitation2? Precipitation { get; set; }
}
public enum Precipitation2
{
Drizzle, Rain, Sleet, Hail, Snow
}
Nama anggota enum kustom
Mulai dari .NET 9, Anda dapat menyesuaikan nama anggota enum menggunakan atribut JsonStringEnumMemberName. Untuk informasi selengkapnya, lihat Nama anggota enum kustom.