C# MVC4中正确的JSON序列化

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(); 这段代码在管道级别

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

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

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核心设计的