首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从ASP.NET MVC控制器方法返回由JSON.NET序列化的camelCase JSON?

如何从ASP.NET MVC控制器方法返回由JSON.NET序列化的camelCase JSON?
EN

Stack Overflow用户
提问于 2013-10-18 17:07:43
回答 11查看 167.5K关注 0票数 279

我的问题是,我希望通过ActionResult从ASP.NET MVC控制器方法返回JSON.NET序列化的ASP.NET(而不是标准的PascalCase) JSON数据。

以下面的C#类为例:

代码语言:javascript
复制
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

默认情况下,当从MVC控制器返回该类的实例作为JSON时,它将按以下方式序列化:

代码语言:javascript
复制
{
  "FirstName": "Joe",
  "LastName": "Public"
}

我希望(由JSON.NET)将其序列化为:

代码语言:javascript
复制
{
  "firstName": "Joe",
  "lastName": "Public"
}

我该怎么做呢?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-10-18 17:07:43

我在Mats Karlsson的blog上找到了一个很好的解决方案。解决方案是编写一个通过JSON.NET序列化数据的ActionResult子类,将后者配置为遵循camelCase约定:

代码语言:javascript
复制
public class JsonCamelCaseResult : ActionResult
{
    public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior)
    {
        Data = data;
        JsonRequestBehavior = jsonRequestBehavior;
    }

    public Encoding ContentEncoding { get; set; }

    public string ContentType { get; set; }

    public object Data { get; set; }

    public JsonRequestBehavior JsonRequestBehavior { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.");
        }

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data == null)
            return;

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings));
    }
}

然后在MVC控制器方法中使用这个类,如下所示:

代码语言:javascript
复制
public ActionResult GetPerson()
{
    return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)};
}
票数 103
EN

Stack Overflow用户

发布于 2014-03-18 23:00:21

或者,简单地说:

代码语言:javascript
复制
JsonConvert.SerializeObject(
    <YOUR OBJECT>, 
    new JsonSerializerSettings 
    { 
        ContractResolver = new CamelCasePropertyNamesContractResolver() 
    });

例如:

代码语言:javascript
复制
return new ContentResult
{
    ContentType = "application/json",
    Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }),
    ContentEncoding = Encoding.UTF8
};
票数 442
EN

Stack Overflow用户

发布于 2016-01-07 05:30:12

我想这就是你想要的简单答案。它来自Shawn Wildermuth的博客:

代码语言:javascript
复制
// Add MVC services to the services container.
services.AddMvc()
  .AddJsonOptions(opts =>
  {
    opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  });
票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19445730

复制
相关文章

相似问题

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