共用方式為


System.Text.Json 元數據讀取器現在取消檢視元數據屬性名稱

連結 System.Text.Json 庫已更新為 unescape 元資料屬性名稱。 這項變更會影響 JSON 檔在參考保留、多型和元數據屬性驗證的內容中解譯的方式。

推出的版本

.NET 9

先前的行為

先前 System.Text.Json 並未解碼元數據屬性名稱。 這會導致接受無效的屬性名稱,這可能會略過元數據屬性驗證。

例如,下列程式代碼會在第一次呼叫中成功,但在第二次呼叫中擲回例外狀況:

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

record MyPoco;

當回傳時名稱需要逸出的元數據屬性,未逸出行為也可能造成多型性問題,如下所示:

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;

新行為

System.Text.Json 現在會取消檢視元數據屬性名稱。 這個新行為表示,在多型反序列化範例中,行 Console.WriteLine(JsonSerializer.Deserialize<Base>(json) is Derived); 現在會傳回 true,而且如果屬性名稱無效,則會因以下例外狀況而無法反序列化:

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

破壞性變更的類型

此變更為行為變更

變更的原因

此變更透過確保中繼資料屬性名稱正確地解除轉義,來改善正確性和可靠性,並預防規避中繼資料屬性的驗證。 如需詳細資訊,請參閱 回報的問題

避免使用逃避來繞過元數據屬性驗證。 相反地,請挑選與元數據屬性不衝突的屬性名稱。

受影響的 API