連結 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.
破壞性變更的類型
此變更為行為變更。
變更的原因
此變更透過確保中繼資料屬性名稱正確地解除轉義,來改善正確性和可靠性,並預防規避中繼資料屬性的驗證。 如需詳細資訊,請參閱 回報的問題。
建議的動作
避免使用逃避來繞過元數據屬性驗證。 相反地,請挑選與元數據屬性不衝突的屬性名稱。