Bagikan melalui


System.Text.Json memeriksa konflik nama properti

Dalam konteks tertentu, seperti polimorfisme dan pelestarian referensi, System.Text.Json mencadangkan nama properti tertentu (misalnya, , $type$id, dan $ref) untuk memancarkan metadata. Beberapa nama properti seperti TypeDiscriminatorPropertyName juga dapat dikonfigurasi dengan nama kustom. Sebelumnya, serializer tidak melakukan validasi apakah nama properti ini bertentangan dengan kontrak yang ditentukan pengguna, yang dapat mengakibatkan properti duplikat dan menghasilkan JSON yang ambigu atau gagal melakukan pulang pergi. Dimulai dengan .NET 10, System.Text.Json memungkinkan validasi untuk mencegah konfigurasi tersebut dan memberikan peringatan dini kepada pengguna.

Versi yang diperkenalkan

.NET 10

Perilaku sebelumnya

Sebelumnya, kode berikut menghasilkan objek JSON yang tidak valid dengan properti duplikat Type dan gagal dideserialisasi dengan JsonException:

using System.Text.Json;
using System.Text.Json.Serialization;

string json = JsonSerializer.Serialize<Animal>(new Dog());
Console.WriteLine(json); // {"Type":"dog","Type":"Dog"}
JsonSerializer.Deserialize<Animal>(json); // JsonException: Deserialized object contains a duplicate 'Type' metadata property.

[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type")]
[JsonDerivedType(typeof(Dog), "dog")]
public abstract class Animal
{
    public abstract string Type { get; }
}

public class Dog : Animal
{
    public override string Type => "Dog";
}

Perilaku baru

Mulai dari .NET 10, setiap upaya untuk membuat serialisasi jenis yang sama mengakibatkan kesalahan validasi awal:

InvalidOperationException: Jenis 'Anjing' berisi properti 'Jenis' yang bertentangan dengan nama properti metadata yang ada. Pertimbangkan untuk mengganti nama atau mengabaikannya dengan JsonIgnoreAttribute.

Kesalahan validasi ini terjadi ketika serializer pertama kali dibuat atau ketika serialisasi pertama kali dicoba, memberikan deteksi dini kontrak serialisasi yang tidak valid.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku.

Alasan perubahan

Perubahan ini memberikan pencegahan dini kontrak serialisasi yang tidak valid. Dengan memvalidasi nama properti di muka, serializer mencegah skenario di mana properti duplikat akan dipancarkan, menghasilkan JSON yang tidak valid yang tidak dapat melakukan round-trip dengan benar. Ini membantu pengembang mengidentifikasi dan memperbaiki masalah konfigurasi selama pengembangan daripada menemukannya pada runtime selama deserialisasi.

Untuk informasi selengkapnya, lihat:

Hindari menggunakan nama properti yang berkonflik dengan properti metadata khusus System.Text.Json (seperti $type, , $iddan $ref). Jika benar-benar diperlukan untuk menyimpan properti seperti itu di kelas, terapkan anotasi JsonIgnoreAttribute pada properti yang bertentangan.

API yang terpengaruh