JsonProperty 属性を柔軟に制御して ASP.NET MVC カスタム JSON シリアル化を実装します
Json.Net を使用する ASP.NET MVC アプリケーションでは、開発者は多くの場合 [JsonProperty(PropertyName = "shortName")]
属性を使用して、JSON シリアル化中のデータ量を削減します。このアプローチは .NET クライアントではうまく機能しますが、ブラウザベースのクライアントでは短縮されたプロパティ名を使用すると問題が発生します。
この問題を解決するには、カスタム コントラクト パーサーを使用して、シリアル化中に [JsonProperty()]
属性を動的に無視します。その方法は次のとおりです:
カスタムコントラクトパーサー
<code class="language-csharp">class LongNameContractResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { var list = base.CreateProperties(type, memberSerialization); foreach (JsonProperty prop in list) { prop.PropertyName = prop.UnderlyingName; } return list; } }</code>
属性の抑制を切り替えます
シリアル化中に [JsonProperty()]
属性を選択的に無視するには、JsonSerializerSettings
の ContractResolver
属性を条件付きで設定できます。例は次のとおりです:
<code class="language-csharp">JsonSerializerSettings settings = new JsonSerializerSettings { Formatting = Formatting.Indented }; if (useLongNames) { settings.ContractResolver = new LongNameContractResolver(); } string jsonString = JsonConvert.SerializeObject(obj, settings);</code>
useLongNames
フラグを設定すると、[JsonProperty()]
属性を無視し、シリアル化に長い属性名を使用するかどうかを制御できます。これにより、特定のクライアントのニーズに基づいて JSON 出力をきめ細かく制御できます。
出力例
次の例を考えてみましょう:
<code class="language-csharp">Foo foo = new Foo { CustomerNumber = "BG60938", CustomerName = "Bubba Gump Shrimp Company" }; Console.WriteLine("--- 使用JsonProperty名称 ---"); Console.WriteLine(Serialize(foo, false)); Console.WriteLine(); Console.WriteLine("--- 忽略JsonProperty名称 ---"); Console.WriteLine(Serialize(foo, true));</code>
出力:
<code>--- 使用JsonProperty名称 --- { "cust-num": "BG60938", "cust-name": "Bubba Gump Shrimp Company" } --- 忽略JsonProperty名称 --- { "CustomerNumber": "BG60938", "CustomerName": "Bubba Gump Shrimp Company" }</code>
[JsonProperty()]
属性を動的にオーバーライドすることで、JSON シリアル化プロセスをカスタマイズして、他のクライアントに対して一貫したオブジェクト階層を維持しながら、特定のクライアントのデータ量を最適化できます。
以上がASP.NET MVCでカスタマイズされたJSONシリアル化のJsonProperty属性を選択的にオーバーライドする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。