我希望JSON被"正确"序列化(camelCase),并且能够在必要时更改日期格式.

对于Web API,这非常简单-在Global.asax中,我执行以下代码

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

这段代码在管道级别以我喜欢的方式处理序列化.

我想在MVC4中完成同样的事情——将控制器操作方法返回的任何JSON正确序列化.通过一点搜索,我找到了下面的代码,可以在全局.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时,它完全是PascalCase的.我的操作方法的一个简单示例:

private JsonResult GetJsonTest()
{
    var returnData = dataLayer.GetSomeObject();
    return Json(returnData, JsonRequestBehavior.AllowGet);
}

我说错了吗?你知道如何在管道层面上做到这一点吗?

推荐答案

我建议使用ServiceStack或Json之类的东西.NET处理MVC应用程序中的Json输出.但是,您可以轻松地编写一个类,并使用基类重写Json方法.请看下面的例子.

注意:这样,您就不需要Global.ascx.cs文件中的任何内容.

Custom JsonDotNetResult class:

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));
    }
}

Base Controller class:

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时都将其输入出来呢?

Asp.net相关问答推荐

C# - 将 xyz 平铺转换为纬度/经度,反之亦然,给出不同的结果

检测 ASP.NET 中的内存泄漏

cookie 存储在系统的什么位置?

如何异步渲染局部视图

ASP.NET Core 1.0 ConfigurationBuilder().AddJsonFile("appsettings.json");找不到文件

ASP.NET GridView 第二个标题行跨越主标题行

Directory.Exists 不适用于网络路径

如何在 ASP.NET Web 窗体中使用依赖注入

.NET 核心 IdentityUser 模型中规范化邮箱和用户名的用途是什么?

如何使用 javascript 调用 ASP.NET c# 方法

asp.net cookie、身份验证和会话超时

为什么 Asp.Net Identity IdentityDbContext 是一个黑盒?

哪些行为驱动开发 (BDD) 工具/框架可用于 Microsoft Stack?

ASP.net 与 PHP( Select 什么)

.NET 上的 HTTP/2(HTTP2 或 SPDY)

在 ASP.NET 中使用 MasterPages 时使用 JQuery 的正确方法?

如何告诉 RadioButtonList 不生成表格

避免在 ASP.NET MVC 中使用会话状态是一种好习惯吗?如果是,为什么以及如何?

通过 CultureInfo 格式化字符串

ModelClientValidationRule 冲突