首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net核心Web每个控制器不同的JSON外壳

.Net核心Web每个控制器不同的JSON外壳
EN

Stack Overflow用户
提问于 2017-04-19 21:19:34
回答 2查看 3.4K关注 0票数 5

我们正在尝试将一个旧的API迁移到当前的.Net核心Web中。当前API使用camelCasing返回JSON,但是我们的旧API使用PascalCasing,我们不想更新客户端。

是否有任何方法来指定我们希望每个控制器使用哪种序列化策略,而不是跨服务使用全局策略?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-09 17:16:24

是的,您可以通过在控制器上使用属性来实现它。见下面的样本:

代码语言:javascript
复制
[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);
    }
}

这是你的控制器:

代码语言:javascript
复制
[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);
    }        
}
票数 8
EN

Stack Overflow用户

发布于 2019-10-06 15:30:32

我已经为OkObjectResult做了一个扩展方法,以便能够选择我不希望camel案例序列化行为的位置。你可以这样使用它:

代码语言:javascript
复制
OkObjectResult(yourResponseObject).PreventCamelCase();

以下是扩展方法:

代码语言:javascript
复制
public static OkObjectResult PreventCamelCase(this OkObjectResult response)
{
    var settings = JsonSerializerSettingsProvider.CreateSerializerSettings();
    settings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();

    var formatter = new JsonOutputFormatter(settings, ArrayPool<Char>.Shared);
    response.Formatters.Add(formatter);
    return response;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43506257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档