当前位置: 首页 > 面试题库 >

更改ASP MVC3中使用的默认JSON序列化程序

夏侯阳
2023-03-14
问题内容

我有一个将大型JSON对象返回到jQueryFlot的控制器,我想知道用更快的东西(例如ServiceStack.Text中的东西)替换默认JavaScriptSerializer会多么容易。

如果我可以使用DependencyResolver来更改此类内容,那将是很好的选择,但是我想,如果绝对可以解决所有问题,它可能会变得很慢。


问题答案:

最好的选择是从JsonResult类继承并覆盖Execute方法,例如

public class CustomJsonResult: JsonResult
{
    public CustomJsonResult()
    {
       JsonRequestBehavior = JsonRequestBehavior.DenyGet;
    }
    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(MvcResources.JsonRequest_GetNotAllowed);
            }

            HttpResponseBase response = context.HttpContext.Response;

            if (!String.IsNullOrEmpty(ContentType)) {
                response.ContentType = ContentType;
            }
            else {
                response.ContentType = "application/json";
            }
            if (ContentEncoding != null) {
                response.ContentEncoding = ContentEncoding;
            }
            if (Data != null) {
                CustomJsSerializer serializer = new CustomJsSerializer();
                response.Write(serializer.Serialize(Data));
            }
        }
}

代码来自mvc3的JsonResult类,并更改了此行

JavaScriptSerializer serializer = new JavaScriptSerializer();

CustomJsSerializer serializer = new CustomJsSerializer();

您可以在操作方法中使用此类,例如

public JsonResult result()
{
    var model = GetModel();
    return new CustomJsonResult{Data = model};
}

另外,您可以在Base控制器中覆盖Controller类的json方法,例如

public class BaseController:Controller
{
   protected internal override JsonResult Json(object data)
        {
            return new CustomJsonResult { Data = data };
        }
}

现在,如果您拥有BaseController中的所有控制器,return Json(data)则将调用序列化方案。Json您还可以选择重写方法的其他重载。



 类似资料:
  • 但是,我发现该模块将使用DefaultJsonSerializer序列化Map和Entry对象(因为它们也是Object对象)。 如何更改默认序列化行为,同时确保条目和映射对象按预期序列化?

  • 问题内容: 无论如何,是否可以在WCF中更改DateTime的默认JSON序列化/反序列化? 目前,DateTime已序列化为该格式,应该没问题,但是当我的服务器不在UTC中时(我无法更改),我遇到了问题。 此服务正在处理的所有日期/时间数据均为UTC格式。服务器处于UTC时一切正常。但是,暂存/生产环境设置为GMT + 1(Paris),并且序列化程序假定日期/时间在GMT + 1中,而完全忽略

  • > 控制器只是实例化这个对象并返回。 在输出中,我看到Date对象的默认表示形式是一个整数(可能是历元的毫秒) 是否有任何方法可以将日期对象的默认jsonification更改为ISO字符串或任何其他字符串? 编辑: 我对Spring和Spring Boot很陌生。我使用的模板来自spring网站上的一个示例应用程序。JSONification是通过Jackson完成的。Rest一下,一般来说,我

  • 问题内容: 是否可以替换WCF的默认JSON序列化(我目前正在测试行为),并作为MIME类型传递。特别是,我不喜欢默认情况下每个属性都是键/值对,例如: 我仅将服务用于启用JSON的端点(使用jQuery + WCF请求数据)。 问题答案: 您可以使用消息格式化程序来更改用于处理JSON的序列化程序。https://docs.microsoft.com/zh- cn/archive/blogs/c

  • 问题内容: 这是我当前的SQL的样子: 这是我的数据库_users表的样子: 我收到此错误: 您的SQL语法有误;检查与您的MariaDB服务器版本相对应的手册,以在’rid_in附近使用正确的语法;-修改列的默认值 链接到此行: 如果我更改此设置,则忽略该值: 它工作正常,如何将输入绑定到查询? 我的预期输出是能够用来更改默认用户角色值并将具有旧用户值的所有行更新为新行: 为了能够更新每个用户的

  • 当反序列化各种JSON消息时,我希望为某种类型的属性提供默认值。通常建议简单地在类中指定值,但如果必须跨许多类这样做,这很容易出错。您可能会忘记一个值,并以而不是默认值结束。我的意图是将每个的属性设置为。由于正是试图消除的内容,因此将它们与Jackson一起使用是令人沮丧的。 Jackson允许您自定义反序列化过程的大多数特性都集中在作为输入的JSON上,而不是围绕实例化要反序列化到的对象的过程。