ホームページ >バックエンド開発 >C++ >Json.NET での JSON シリアル化中に JsonProperty 属性をオーバーライドするにはどうすればよいですか?

Json.NET での JSON シリアル化中に JsonProperty 属性をオーバーライドするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-07 16:06:44711ブラウズ

How to Override the JsonProperty Attribute During JSON Serialization with Json.NET?

JSON シリアル化に Json.NET を使用する場合の

JsonPropertyAttribute

のオーバーライド

ASP.Net MVC と Json.Net を使用した JSON シリアル化のシナリオでは、[JsonProperty(PropertyName = "shortName")] 属性を利用してペイロード サイズを最適化することが非常に効果的です。このアプローチは、受信側が別の .Net アプリケーションまたはサービスである場合に便利です。これは、逆シリアル化により、ペイロード サイズを最小限に抑えながら、元のプロパティ名を使用してオブジェクト階層が再構築されるためです。

ただし、クライアントがブラウザ経由でアクセスされる JavaScript または Ajax アプリケーションである場合、問題が発生します。クライアントは短縮されたプロパティ名を持つ JSON を受信するため、最適な使用が妨げられます。この記事では、JSON シリアル化中に [JsonProperty(PropertyName = "shortName")] 属性をプログラムでバイパスする方法について説明します。

この目的のためには、カスタム コントラクト パーサーを使用することが最善の解決策です。実装は次のとおりです:

<code class="language-csharp">public class LongNameContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        // 使用基类生成具有简短名称的JsonProperty
        IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);

        // 将简短名称替换为原始属性名称
        foreach (JsonProperty property in properties)
        {
            property.PropertyName = property.UnderlyingName;
        }

        return properties;
    }
}</code>

カスタム パーサーを統合することで、シリアル化の動作を簡単に制御できます。その効能は以下の通りです:

<code class="language-csharp">public class Program
{
    public static void Main(string[] args)
    {
        Foo foo = new Foo
        {
            CustomerName = "Bubba Gump Shrimp Company",
            CustomerNumber = "BG60938"
        };

        Console.WriteLine("--- 使用JsonProperty名称 ---");
        Console.WriteLine(Serialize(foo, false));
        Console.WriteLine();
        Console.WriteLine("--- 忽略JsonProperty名称 ---");
        Console.WriteLine(Serialize(foo, true));
    }

    public static string Serialize(object obj, bool useLongNames)
    {
        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Formatting = Formatting.Indented;
        if (useLongNames)
        {
            settings.ContractResolver = new LongNameContractResolver();
        }

        return JsonConvert.SerializeObject(obj, settings);
    }
}</code>

出力:

<code class="language-json">--- 使用JsonProperty名称 ---
{
  "cust-num": "BG60938",
  "cust-name": "Bubba Gump Shrimp Company"
}

--- 忽略JsonProperty名称 ---
{
  "CustomerNumber": "BG60938",
  "CustomerName": "Bubba Gump Shrimp Company"
}</code>

以上がJson.NET での JSON シリアル化中に JsonProperty 属性をオーバーライドするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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