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.
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:
- [STJ] Melarang nama properti yang bertentangan dengan nama properti metadata (dotnet/runtime#106390)
- Melarang jenis dengan nama properti yang bertentangan dengan metadata (dotnet/runtime#106460)
Tindakan yang direkomendasikan
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.