ホームページ >バックエンド開発 >C++ >System.Text.Json でシリアル化コントラクトをカスタマイズするにはどうすればよいですか?

System.Text.Json でシリアル化コントラクトをカスタマイズするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-03 11:45:40705ブラウズ

How Can I Customize Serialization Contracts in System.Text.Json?

System.Text.Json でのシリアル化コントラクトのカスタマイズ

新しい System.Text.Json API は、シリアル化コントラクトをカスタマイズする機能を提供します。 Newtonsoft の IContractResolver に似た機能。

コントラクトのカスタマイズ.NET 7 では

.NET 7 では、IJsonTypeInfoResolver インターフェイスを通じてコン​​トラクトのカスタマイズが可能です。このインターフェイスを使用すると、開発者は、指定された型と JsonSerializerOptions の組み合わせに対して構成された JsonTypeInfo インスタンスを返すカスタム リゾルバーを作成できます。

カスタム リゾルバーの作成

カスタム リゾルバーを作成する 1 つの方法は、次のとおりです。 DefaultJsonTypeInfoResolver をサブクラス化し、GetTypeInfo(Type, JsonSerializerOptions) メソッド。あるいは、Action を追加することもできます。作成後にデフォルトの JsonTypeInfo を変更するには、DefaultJsonTypeInfoResolver.Modifiers コレクションに追加します。

例: 選択フィールドのシリアル化

System.Text の SelectiveSerializer クラスの機能を複製するには。 Json のような修飾子アクションを使用できます。以下:

resolver.Modifiers.Add(typeInfo =>
{
    if (typeInfo.Kind == JsonTypeInfoKind.Object)
    {
        foreach (var property in typeInfo.Properties)
        {
            if (property.GetMemberName() is {} name && !membersToSerializeSet.Contains(name))
                property.ShouldSerialize = static (obj, value) => false;
        }
    }
});

この修飾子は、指定されたフィールド名に一致するプロパティをチェックし、それらの ShouldSerialize プロパティを false に設定してシリアル化から除外します。

リゾルバーの設定

カスタム リゾルバーを作成したら、 JsonSerializerOptions.TypeInfoResolver プロパティ。例:

var options = new JsonSerializerOptions
{
    TypeInfoResolver = new DefaultJsonTypeInfoResolver()
        .SerializeSelectedFields("FirstName,Email,Id"),
    // Other options as required
};

補足事項

  • PropertyNamePolicy と WriteIndented を設定して、プロパティの名前付けとインデントをカスタマイズできます。
  • JsonPropertyInfo。 ShouldSerialize は条件付きシリアル化に使用できます。 properties.
  • System.Text.Json はデフォルトで大文字と小文字が区別されるため、選択したフィールドをフィルタリングするときは大文字と小文字を区別した比較を使用することが重要です。

以上がSystem.Text.Json でシリアル化コントラクトをカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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