ホームページ >バックエンド開発 >C++ >カスタム JsonConverters でデフォルトの JSON シリアル化動作を保持するにはどうすればよいですか?

カスタム JsonConverters でデフォルトの JSON シリアル化動作を保持するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-10 09:08:42473ブラウズ

How Can I Preserve Default JSON Serialization Behavior in Custom JsonConverters?

カスタム JsonConverter のデフォルトのシリアル化オーバーライド

質問

カスタム書き込みロジックを使用せずに、カスタム System.Text.Json.JsonConverter でデフォルトのシリアル化動作を保持するにはどうすればよいですか?

説明

JsonConverter の選択には、次のような異なる優先順位があります。

  • 属性レベルの機能
  • コンバーター コレクションにコンバーターが追加されました
  • カスタム値タイプまたは POCO に適用される属性
  • コンバーター工場から返却されたコンバーター

解決策

コンバーターの適用方法に応じて、デフォルトのシリアル化を実装するさまざまな方法があります。

属性レベルの機能

JsonSerializer.Serialize(writer, person, options); を呼び出すと、デフォルトのシリアル化が生成されます。

コンバーター コレクションのコンバーター

  • 渡されたオプションをコピーし、コピーのコンバーター リストからコンバーターを削除します。
  • 変更したオプションを JsonSerializer.Serialize に渡します(Utf8JsonWriter, T, JsonSerializerOptions);
  • 注: このメソッドはスレッドセーフではない可能性があり、再帰型で問題が発生する可能性があります。

カスタム値タイプまたは POCO

  • 現在、カスタム値タイプまたは POCO に適用されるコンバーターのデフォルトのシリアル化の生成はサポートされていません。

コンバーターファクトリー

  • DefaultConverterFactory を使用して、デフォルトのシリアル化を生成するコンバーターを作成します。
  • コンバータを含まない製造されたコンバータの変更されたオプションをキャッシュします。

コンバータ ファクトリを使用する例を次に示します:

<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person>
{
    ...

    protected override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions modifiedOptions)
        => (T)JsonSerializer.Deserialize(ref reader, typeToConvert, modifiedOptions);

    protected override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions modifiedOptions) 
        => JsonSerializer.Serialize(writer, value, modifiedOptions);
}

...

var person = new Person("John", "Doe");
var options = new JsonSerializerOptions { Converters = { new PersonConverter() } };
var json = JsonSerializer.Serialize(person, options);</code>

重要な注意事項

  • DefaultConverterFactory をカスタム値型または POCO に直接適用すると、スタック オーバーフローが発生します。
  • JsonSerializer.Serialize(writer, person, options); を使用すると、プロパティ レベルのプロパティにコンバータを適用するときにデフォルトのシリアル化が行われます。

以上がカスタム JsonConverters でデフォルトの JSON シリアル化動作を保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。