C# MVC4中正确的JSON序列化
我希望JSON被“正确”序列化(camelCase),并且能够在必要时更改日期格式 对于Web API,这非常简单-在Global.asax中,我执行以下代码C# MVC4中正确的JSON序列化,c#,asp.net,asp.net-mvc,json,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Json,Asp.net Mvc 4,我希望JSON被“正确”序列化(camelCase),并且能够在必要时更改日期格式 对于Web API,这非常简单-在Global.asax中,我执行以下代码 var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 这段代码在管道级别
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
这段代码在管道级别以我喜欢的方式处理序列化
我想在MVC4中完成同样的事情——将从控制器操作方法返回的任何JSON正确序列化。通过一点搜索,我找到了要在Global.asax应用程序启动时抛出的以下代码:
HttpConfiguration config = GlobalConfiguration.Configuration;
Int32 index = config.Formatters.IndexOf(config.Formatters.JsonFormatter);
config.Formatters[index] = new JsonMediaTypeFormatter
{
SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }
};
它似乎执行得很好,但当我从控制器返回JSON时,它就完全被激活了。我的动作方法的一个简单示例:
private JsonResult GetJsonTest()
{
var returnData = dataLayer.GetSomeObject();
return Json(returnData, JsonRequestBehavior.AllowGet);
}
我做错了吗?知道如何在管道级别实现这一点吗?当Web API使用JSON.NET时,MVC4默认使用JavaScriptSerializer,我认为它不支持更改为驼峰式序列化。选中此项: 我的建议是,按照此处所述创建一个自定义JsonNetResult,并将最后一行更改为:
var serializedObject = JsonConvert.SerializeObject(
Data,
Formatting.Indented,
new JsonSerializerSettings { MappingResolver = new CamelCaseMappingResolver() });
我建议在MVC应用程序中使用ServiceStack或Json.NET之类的工具来处理Json输出。但是,您可以轻松地编写类并使用基类重写Json方法。请参见下面的示例 注意:这样,您就不需要Global.ascx.cs文件中的任何内容 自定义JsonDotNetResult类:
public class JsonDotNetResult : JsonResult
{
private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new List<JsonConverter> { new StringEnumConverter() }
};
public override void ExecuteResult(ControllerContext context)
{
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("GET request not allowed");
}
var response = context.HttpContext.Response;
response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json";
if (this.ContentEncoding != null)
{
response.ContentEncoding = this.ContentEncoding;
}
if (this.Data == null)
{
return;
}
response.Write(JsonConvert.SerializeObject(this.Data, Settings));
}
}
public abstract class Controller : System.Web.Mvc.Controller
{
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonDotNetResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}
现在,在控制器操作中,您可以简单地返回如下内容
return Json(myObject, JsonRequestBehavior.AllowGet);
砰。现在,您已经返回了带有Json的camelcase对象:)
注意:在使用Json创建的每个对象上,都可以通过序列化程序设置来实现这一点。但谁会希望在每次您想要返回Json时都将其输入出来呢
Note that below information is for Asp .Net core
.Net团队最近宣布,MVC现在默认使用驼峰大小写名称序列化JSON
通过以下几行,您将能够启用此功能:
services
.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver = new DefaultContractResolver());
我在同一个网站上写了一个小博客,也就是说。您可以创建一个静态方法来返回一个
ContentResult
,该方法利用NewtonSoft.Json
库执行类似于以下内容的序列化:
publicstaticcontentresult.json(TData响应)
{
DefaultContractResolver解析器=新的CamelCasePropertyNamesContractResolver();
JsonSerializerSettings设置=新的JsonSerializerSettings
{
合同解析程序=解析程序,
DateFormatHandling=DateFormatHandling.IsoDateFormat
};
返回新的ContentResult
{
Content=JsonConvert.SerializeObject(响应、设置),
ContentType=“应用程序/json”
};
}
用法示例:
[HttpGet]
public ContentResult GetCamelCaseJsonData()
{
返回ContentUtils.CamelJson(结果);
}
输出将是驼峰格式。我没有意识到json规范要求驼峰格式……据我所知,驼峰格式的json更为广泛接受,不这样做会破坏框架。另外,我们的开发标准规定了这一点,所以这就是我正在做的。我不应该从API返回数据对象。更好地创建模型/服务合同/任何东西,并将其返回。问题不仅在于潜在的数据泄漏,还在于API客户端对内部数据对象的高风险添加依赖性。有人重命名了一个数据属性,你的用户界面就坏了。是的,但它是为aspnet核心设计的