Bagikan melalui


Pembaca metadata System.Text.Json sekarang menghilangkan karakter pelolosan dari nama properti metadata

Pustaka System.Text.Json telah diperbarui ke nama properti metadata unescape. Perubahan ini memengaruhi bagaimana dokumen JSON ditafsirkan dalam konteks pelestarian referensi, polimorfisme, dan validasi properti metadata.

Versi yang diperkenalkan

.NET 9

Perilaku sebelumnya

Sebelumnya, System.Text.Json tidak mengubah kode karakter nama properti metadata. Ini akan menyebabkan nama properti yang tidak valid diterima, yang dapat melewati validasi properti metadata.

Misalnya, kode berikut akan berhasil dalam panggilan pertama tetapi melemparkan pengecualian dalam panggilan kedua:

JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
JsonSerializer.Deserialize<MyPoco>("""{"\u0024invalid" : 42 }""", options);
JsonSerializer.Deserialize<MyPoco>("""{"$invalid" : 42 }""", options);

record MyPoco;

Perilaku unescaping juga dapat menyebabkan masalah polimorfisme ketika melakukan roundtripping properti metadata yang namanya memerlukan pelepasan, seperti yang terlihat di sini:

string json = JsonSerializer.Serialize<Base>(new Derived());
Console.WriteLine(json); // {"categor\u00EDa":"derived"}
Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); // False

[JsonPolymorphic(TypeDiscriminatorPropertyName = "categoría")]
[JsonDerivedType(typeof(Derived), "derived")]
public record Base;
public record Derived : Base;

Perilaku baru

System.Text.Json sekarang menghilangkan pencacatan nama properti metadata. Perilaku baru ini berarti bahwa baris Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); dari contoh deserialisasi polimorfik sekarang mengembalikan true, dan bahwa nama properti yang tidak valid gagal dideserialisasi dengan pengecualian berikut:

Unhandled exception. System.Text.Json.JsonException: Properties that start with '$' are not allowed in types that support metadata.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku .

Alasan perubahan

Perubahan ini meningkatkan kebenaran dan keandalan dengan memastikan bahwa nama properti metadata di-unescape dengan benar, mencegah terlewati validasi properti metadata. Untuk detail selengkapnya, lihat masalah yang dilaporkan.

Hindari menggunakan pelolosan untuk menghindari validasi properti metadata. Sebagai gantinya, pilih nama properti yang tidak berkonflik dengan properti metadata.

API yang terpengaruh