Bagikan melalui


Properti yang diperlukan

Anda dapat menandai properti tertentu untuk menandakan bahwa properti tersebut harus ada di payload JSON agar deserialisasi berhasil. Demikian pula, Anda dapat mengatur opsi untuk menentukan bahwa semua parameter konstruktor non-opsional ada dalam payload JSON. Jika satu atau beberapa properti yang diperlukan ini tidak ada, JsonSerializer.Deserialize metode melemparkan JsonException.

Ada tiga cara untuk menandai properti atau bidang sesuai kebutuhan untuk deserialisasi JSON:

Untuk menentukan bahwa semua parameter konstruktor non-opsional diperlukan untuk deserialisasi JSON, atur JsonSerializerOptions.RespectRequiredConstructorParameters opsi (atau, untuk pembuatan sumber, RespectRequiredConstructorParameters properti) ke true. Untuk informasi selengkapnya, lihat bagian Parameter konstruktor non-opsional.

Dari perspektif serializer, pengubah dan [JsonRequired] atribut C# required setara, dan keduanya memetakan ke bagian metadata yang sama, yaitu JsonPropertyInfo.IsRequired. Dalam kebanyakan kasus, Anda hanya akan menggunakan kata kunci C# bawaan. Namun, dalam kasus berikut, Anda harus menggunakan JsonRequiredAttribute sebagai gantinya:

  • Jika Anda menggunakan bahasa pemrograman selain C# atau versi C#tingkat bawah.
  • Jika Anda hanya ingin persyaratan berlaku untuk deserialisasi JSON.
  • Jika Anda menggunakan System.Text.Json serialisasi dalam mode pembuatan sumber. Dalam hal ini, kode Anda tidak akan dikompilasi jika Anda menggunakan pengubah required , karena pembuatan sumber terjadi pada waktu kompilasi.

Cuplikan kode berikut menunjukkan contoh properti yang dimodifikasi dengan required kata kunci. Properti ini harus ada dalam payload JSON agar deserialisasi berhasil.

public static void RunIt()
{
    // The following line throws a JsonException at run time.
    Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
}

public class Person
{
    public required string Name { get; set; }
    public int Age { get; set; }
}

Atau, Anda dapat menggunakan JsonRequiredAttribute:

public static void RunIt()
{
    // The following line throws a JsonException at run time.
    Console.WriteLine(JsonSerializer.Deserialize<Person>("""{"Age": 42}"""));
}

public class Person
{
    [JsonRequired]
    public string Name { get; set; }
    public int Age { get; set; }
}

Dimungkinkan juga untuk mengontrol apakah properti diperlukan melalui model kontrak menggunakan JsonPropertyInfo.IsRequired properti :

public static void RunIt()
{
    var options = new JsonSerializerOptions
    {
        TypeInfoResolver = new DefaultJsonTypeInfoResolver
        {
            Modifiers =
            {
                static typeInfo =>
                {
                    if (typeInfo.Kind != JsonTypeInfoKind.Object)
                        return;

                    foreach (JsonPropertyInfo propertyInfo in typeInfo.Properties)
                    {
                        // Strip IsRequired constraint from every property.
                        propertyInfo.IsRequired = false;
                    }
                }
            }
        }
    };

    // Deserialization succeeds even though
    // the Name property isn't in the JSON payload.
    JsonSerializer.Deserialize<Person>("""{"Age": 42}""", options);
}

public class Person
{
    public required string Name { get; set; }
    public int Age { get; set; }
}

Parameter konstruktor non-opsional

Sebelum .NET 9, deserialisasi berbasis konstruktor memperlakukan semua parameter konstruktor sebagai opsional, seperti yang ditunjukkan contoh berikut:

var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }

record Person(string Name, int Age);

Mulai dari .NET 9, Anda dapat mengatur RespectRequiredConstructorParameters bendera untuk memperlakukan parameter konstruktor non-opsional sesuai kebutuhan.

public static void RunIt()
{
    JsonSerializerOptions options = new()
    {
        RespectRequiredConstructorParameters = true
    };
    string json = """{"Age": 42}""";

    // The following line throws a JsonException at run time.
    JsonSerializer.Deserialize<Person>(json, options);
}

record Person(string Name, int? Age = null);

Tombol fitur

Anda dapat mengaktifkan RespectRequiredConstructorParameters pengaturan secara global menggunakan sakelar System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault fitur. Tambahkan item MSBuild berikut ke file proyek Anda (misalnya, file .csproj ):

<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>

RespectRequiredConstructorParametersDefault API diimplementasikan sebagai bendera keikutsertaan di .NET 9 untuk menghindari melanggar aplikasi yang ada. Jika Anda menulis aplikasi baru, sangat disarankan agar Anda mengaktifkan bendera ini dalam kode Anda.

Lihat juga