次の方法で共有


System.Text.Json メタデータ リーダーがメタデータ プロパティ名をエスケープ解除するようになりました

System.Text.Json ライブラリが、メタデータ プロパティ名をアンエスケープするように更新されました。 この変更は、参照保持、ポリモーフィズム、およびメタデータ プロパティ検証のコンテキストでの JSON ドキュメントの解釈方法に影響します。

導入されたバージョン

.NET 9

以前の動作

以前は、 System.Text.Json はメタデータ プロパティ名をエスケープしませんでした。 これにより、無効なプロパティ名が受け入れられ、メタデータ プロパティの検証がバイパスされる可能性があります。

たとえば、次のコードは最初の呼び出しでは成功しますが、2 番目の呼び出しでは例外をスローします。

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