カスタム System.Text.Json JsonConverter でデフォルトのシリアル化を実装します
カスタム System.Text.Json.JsonConverter<T>
を実装してデータ モデルをアップグレードする場合、Write()
メソッドをオーバーライドする必要がある場合があります。ただし、場合によっては、デフォルトのシリアル化動作を保持したい場合があります。これを達成するには、次の戦略を利用できます。
1. プロパティに適用される JsonConverter
カスタム コンバーターがプロパティに適用されている場合、Write()
メソッド内で JsonSerializer.Serialize(writer, person, options);
を呼び出すだけで、デフォルトのシリアル化が生成されます。
2. コンバーター コレクションにコンバーターが追加されました
この場合、次のようにして Write()
メソッドの Converters
コレクションを変更できます。
<code class="language-csharp">public override void Write(Utf8JsonWriter writer, Person person, JsonSerializerOptions options) { // 复制传入的选项并移除自定义转换器。 var modifiedOptions = options.CopyAndRemoveConverter(typeof(PersonConverter)); JsonSerializer.Serialize(writer, person, modifiedOptions); }</code>
3. カスタム値タイプまたは POCO に適用される JsonConverter
現在、このシナリオのデフォルトのシリアル化を生成する組み込みメソッドはありません。
4. JsonConverterFactory によって返されるコンバーター
コンバーター リストでコンバーター ファクトリの使用を無効にするには、ファクトリの適用時にシリアル化をスキップするカスタム コンバーターを返す を作成することを検討してください。 JsonConverterFactory
実装の改善
提供された例では、改善された実装では が使用されています。このクラスを使用すると、製造されたコンバータでコピーされたオプションを簡単にキャッシュできるようになります。完全な実装は次のようになります: DefaultConverterFactory<T>
<code class="language-csharp">public sealed class PersonConverter : DefaultConverterFactory<Person> { // ... 原问题的现有代码 ... } public abstract class DefaultConverterFactory<T> : JsonConverterFactory { // ... 接受的答案中的现有代码 ... } public static class JsonSerializerExtensions { // ... 接受的答案中的现有代码 ... }</code>
その他の指示
DefaultConverterFactory
以上がカスタム System.Text.Json JsonConverter を使用するときにデフォルトのシリアル化を保持する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。