2017-04-19 9 views
1

私たちは古いAPIを現在の.Net Core Web APIに移行しようとしています。現在のAPIはcamelCasingを使用してJSONを返しますが、古いAPIではPascalCasingが使用されているため、クライアントを更新する必要はありません。.Net Core Web APIコントローラごとに異なるJSONケーシング

サービス全体ではなく、コントローラごとに使用するシリアル化戦略を指定する方法はありますか。

+0

[asp.netコア1.0 Web APIを利用キャメルケース]の可能な重複(http://stackoverflow.com/questions/38139607/asp-net-core-1-0-web-api-use-camelcase) – Set

+0

私はそうは思わない、コントローラごとではなく、API全体でCamelCaseを要求していると思う。 –

+0

[JsonProperty ]タグを関連するモデルのすべての属性に追加します。理想的な解決策ではありません(私たちはたくさんのモデルを持っています)が、今のところ働いています。 –

答えて

1

はい、コントローラーの属性を使用して達成できます。下のサンプルを参照してください:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class CustomJsonFormatter : ActionFilterAttribute 
{ 
    private readonly string formatName = string.Empty; 
    public CustomJsonFormatter(string _formatName) 
    { 
     formatName = _formatName; 
    } 

    public override void OnActionExecuted(ActionExecutedContext context) 
    { 
     if (context == null || context.Result == null) 
     { 
      return; 
     } 

     var settings = JsonSerializerSettingsProvider.CreateSerializerSettings(); 

     if (formatName == "camel") 
     { 
      settings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); 
     }    
     else 
     { 
      settings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); 
     } 

     var formatter = new JsonOutputFormatter(settings, ArrayPool<Char>.Shared); 

     (context.Result as Microsoft.AspNetCore.Mvc.OkObjectResult).Formatters.Add(formatter); 
    } 
} 

とここにあなたのコントローラです:

[CustomJsonFormatter("camel")] 
[Route("api/[controller]")] 
public class ValuesController : Controller 
{ 
    // GET: api/values 
    [HttpGet] 
    public IActionResult Get() 
    { 
     Car car = new Car { Color = "red", Make = "Nissan" }; 

     return Ok(car); 
    }   
} 
関連する問題