ホームページ > バックエンド開発 > C++ > カスタム JSON コンバーター内でデフォルトの System.Text.Json シリアル化を利用する方法は?

カスタム JSON コンバーター内でデフォルトの System.Text.Json シリアル化を利用する方法は?

Patricia Arquette
リリース: 2025-01-09 22:57:41
オリジナル
494 人が閲覧しました

How to Leverage Default System.Text.Json Serialization within a Custom JSON Converter?

カスタム System.Text.Json コンバーターでデフォルトの JSON シリアル化を実装するにはどうすればよいですか?

System.Text.Json のカスタム JSON コンバーターを開発する場合、Write メソッドのデフォルトのシリアル化で十分な状況が発生することがあります。これを達成するには、いくつかのアプローチが考えられます。

デフォルトのシリアル化を実装するオプション

オプション 1: プロパティレベルの JsonConverter を使用する

[JsonConverter] 属性が特定のプロパティに適用されている場合、JsonSerializer.Serialize(writer, person, options); を呼び出すと、そのプロパティのデフォルトのシリアル化が生成されます。

オプション 2: JsonSerializerOptions をコピーして変更する

カスタム コンバーターの Write メソッドでは、渡された JsonSerializerOptions のコピーを作成し、コピーの Converters リストからカスタム コンバーターを削除し、変更したオプションを JsonSerializer.Serialize<T>(Utf8JsonWriter, T, JsonSerializerOptions);Medium に渡すことができます。再帰型を使用する場合、このアプローチには制限があることに注意してください。

オプション 3: カスタム コンバーター ファクトリを使用する

JsonConverterFactory をカスタム コンバーターの基本クラスとして定義することで、カスタム コンバーターの作成を制御できます。ファクトリの CreateConverter メソッドでは、シリアル化と逆シリアル化に変更されたオプションを使用するネストされた DefaultConverter を作成できます。

オプション 4: コンバーター ファクトリをプロパティ レベルの JsonConverter に適用します

注: このメソッドはスタック オーバーフローを引き起こす可能性があります。

JsonConverterFactory がカスタム値型または POCO に適用される場合、シリアル化中にスタック オーバーフローが発生する可能性があります。

実装例

次の変更された PersonConverter は、カスタム コンバーター ファクトリを使用してデフォルトのシリアル化を実装する方法を示しています。

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    ... // 使用修改后的选项实现Read和Write方法

    public override bool CanConvert(Type typeToConvert) => typeof(Person) == typeToConvert;

    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
        => new DefaultConverter(options, this);
}</code>
ログイン後にコピー

基本クラスでは、DefaultConverterFactory 拡張メソッドを使用して、カスタム コンバーターを除く、オプションの変更されたコピーが作成されます。 CopyAndRemoveConverter

この方法は、シリアル化と逆シリアル化に異なる

を使用するよりも柔軟性が高くなります。 JsonSerializerOptions

以上がカスタム JSON コンバーター内でデフォルトの System.Text.Json シリアル化を利用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート