我的问题是,我希望通过ActionResult从ASP.NET MVC控制器方法返回JSON.NET序列化的ASP.NET(而不是标准的PascalCase) JSON数据。
以下面的C#类为例:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
默认情况下,当从MVC控制器返回该类的实例作为JSON时,它将按以下方式序列化:
{
"FirstName": "Joe",
"LastName": "Public"
}
我希望(由JSON.NET)将其序列化为:
{
"firstName": "Joe",
"lastName": "Public"
}
我该怎么做呢?
发布于 2013-10-18 17:07:43
我在Mats Karlsson的blog上找到了一个很好的解决方案。解决方案是编写一个通过JSON.NET序列化数据的ActionResult子类,将后者配置为遵循camelCase约定:
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控制器方法中使用这个类,如下所示:
public ActionResult GetPerson()
{
return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)};
}
发布于 2014-03-18 23:00:21
或者,简单地说:
JsonConvert.SerializeObject(
<YOUR OBJECT>,
new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
例如:
return new ContentResult
{
ContentType = "application/json",
Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }),
ContentEncoding = Encoding.UTF8
};
发布于 2016-01-07 05:30:12
我想这就是你想要的简单答案。它来自Shawn Wildermuth的博客:
// Add MVC services to the services container.
services.AddMvc()
.AddJsonOptions(opts =>
{
opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
https://stackoverflow.com/questions/19445730
复制相似问题