超高性能的json序列化之MVC中使用Json.Net

超高性能的json序列化之MVC中使用Json.Net

先不废话,直接上代码

Asp.net MVC自带Json序列化

 1 /// <summary>
2 /// 加载组件列表
3 /// </summary>
4 /// <param name="departmentId">作业部/厂</param>
5 /// <param name="unitId">组件Id</param>
6 /// <param name="tag">标签号</param>
7 /// <param name="pageIndex">当前页码</param>
8 /// <param name="pageSize">每页条数</param>
9 /// <returns>返回组件json数据</returns>
10 public JsonResult ListCom(long departmentId, IEnumberable<long> unitIds, string tag, int pageIndex, int pageSize)
11 {
12 var dataEntity = LdarService.ListCom(unitIds, tag, pageIndex + 1, pageSize);
13 var dataModel = new Page<LdComModel> {Total = dataEntity.Total};
14 var data =
15 dataModel.DataList =
16 dataEntity.DataList.Select(model => Builder.Builder.Convert<LdComModel>(new object[] {model}));
17 dataModel.DataList = data;
18 return Json(new {
19 msg = CommonModelBuilder.BuildQuerySuccessMessage("组件信息维护", (int) dataModel.Total),
20 data = dataModel.DataList,
21 total = dataModel.Total
22 });
23 }
显示到前台界面

请求的报文

LdComModel类中关联了很多外表,也就是导航属性,导航也被序列化,这样不科学,会将所有属性包括导航属性都序列化,还可能会造成循环引用,导致报错。
我只想序列需要的字段,这时可以手写一个匿名类
1 var data=new {
2 model.AreaName,
3 model.AreaId,
4 ......
5 };

这么写字段少还好,字段多就很不爽吧。

这时我们可以用Json.Net序列化,首先引用newtonsoft.json.dll,使用nuget引用比较方便。在不想序列化的属性上打上[JsonIgnore]特性,序列化就会被忽略。

 1 /// <summary>
2 /// 分区
3 /// </summary>
4 [JsonIgnore]
5 public LdAreaModel LdAreaModel { get; set; }
6
7 /// <summary>
8 /// 区域名称
9 /// </summary>
10 public string AreaName
11 {
12 get
13 {
14 return LdAreaModel.LdarAreaName;
15 }
16 }

使用JsonNet序列化

 1 /// <summary>
2 /// 加载组件列表
3 /// </summary>
4 /// <param name="departmentId">作业部/厂</param>
5 /// <param name="unitId">组件Id</param>
6 /// <param name="tag">标签号</param>
7 /// <param name="pageIndex">当前页码</param>
8 /// <param name="pageSize">每页条数</param>
9 /// <returns>返回组件json数据</returns>
10 public JsonResult ListCom(long departmentId, IEnumberable<long> unitIds, string tag, int pageIndex, int pageSize)
11 {
12 var dataEntity = LdarService.ListCom(unitIds, tag, pageIndex + 1, pageSize);
13 var dataModel = new Page<LdComModel> {Total = dataEntity.Total};
14 var data =
15 dataModel.DataList =
16 dataEntity.DataList.Select(model => Builder.Builder.Convert<LdComModel>(new object[] {model}));
17 dataModel.DataList = data;
18 var result = new JsonNetResult()
19 {
20 Data = new
21 {
22 msg = CommonModelBuilder.BuildQuerySuccessMessage("组件信息维护", (int) dataModel.Total),
23 data = dataModel.DataList,
24 total = dataModel.Total
25 }
26 };
27 return result;
28 }

导航属性没有被序列化,速度也快了很多。

这样写,虽然可以实现功能,很每次都要new一个JsonNetResult对象,写起来很是不爽,能不能给Controller写个扩展方法,像Json(...)一样直接写JsonNet(...)?

Controller中Json(...)方法的部分源码

 1     /// <summary>
2 /// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 的 <see cref="T:System.Web.Mvc.JsonResult"/> 对象。
3 /// </summary>
4 ///
5 /// <returns>
6 /// 将指定对象序列化为 JSON 格式的 JSON 结果对象。在执行此方法所准备的结果对象时,ASP.NET MVC 框架会将该对象写入响应。
7 /// </returns>
8 /// <param name="data">要序列化的 JavaScript 对象图。</param>
9 protected internal JsonResult Json(object data)
10 {
11 return this.Json(data, (string) null, (Encoding) null, JsonRequestBehavior.DenyGet);
12 }
13
14 // <summary>
15 /// 创建 <see cref="T:System.Web.Mvc.JsonResult"/> 对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。
16 /// </summary>
17 ///
18 /// <returns>
19 /// 将指定对象序列化为 JSON 格式的结果对象。
20 /// </returns>
21 /// <param name="data">要序列化的 JavaScript 对象图。</param><param name="contentType">内容类型(MIME 类型)。</param><param name="contentEncoding">内容编码。</param><param name="behavior">JSON 请求行为</param>
22 protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
23 {
24 return new JsonResult()
25 {
26 Data = data,
27 ContentType = contentType,
28 ContentEncoding = contentEncoding,
29 JsonRequestBehavior = behavior
30 };
31 }

我们可以仿照Controller中的源码,自己给Controller写个扩展方法JsonNet(...)

 Controller扩展方法

写个JsonNetResult类,继承自JsonResult,重写ExecuteResult()方法,内部使用JsonNet来序列化。

 JsonNetResult

封装后的JsonNet序列化

 1 /// <summary>
2 /// 加载组件列表
3 /// </summary>
4 /// <param name="departmentId">作业部/厂</param>
5 /// <param name="unitId">组件Id</param>
6 /// <param name="tag">标签号</param>
7 /// <param name="pageIndex">当前页码</param>
8 /// <param name="pageSize">每页条数</param>
9 /// <returns>返回组件json数据</returns>
10 public JsonNetResult ListCom(long departmentId, IEnumberable<long> unitIds, string tag, int pageIndex, int pageSize)
11 {
12 var dataEntity = LdarService.ListCom(listUnitId, tag, pageIndex + 1, pageSize);
13 var dataModel = new Page<LdComModel> {Total = dataEntity.Total};
14 var data =
15 dataModel.DataList =
16 dataEntity.DataList.Select(model => Builder.Builder.Convert<LdComModel>(new object[] {model}));
17 dataModel.DataList = data;
18 return this.JsonNet(new
19 {
20 msg = CommonModelBuilder.BuildQuerySuccessMessage("组件信息维护", (int) dataModel.Total),
21 data = dataModel.DataList,
22 total = dataModel.Total
23 });
24 }

这样调用起来跟自带的Json(...)一样,非常方便。

由于时间关系,博客就先写到这里。不足及错误之处,敬请批评指正。

 
 
标签: MVCJSON

超高性能的json序列化的更多相关文章

  1. 超高性能的json序列化之MVC中使用Json.Net

    先不废话,直接上代码 Asp.net MVC自带Json序列化 /// <summary> /// 加载组件列表 /// </summary> /// <param na ...

  2. .Net深入实战系列—JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

  3. Newtonsoft.Json 序列化和反序列化 时间格式【转】

    1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg:   A a=new A(); a.Name="Elain ...

  4. [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类

    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...

  5. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  6. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  7. 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具

    ASP.Net MVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer.性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应 ...

  8. Windows Phone 六、JSON序列化

    JSON序列化 public class Person { public int Id { get; set; } public string Name { get; set; } public in ...

  9. [MVC_Json序列化]MVC之Json序列化循环引用

    在做MVC项目时,难免会遇到Json序列化循环引用的问题,大致错误如下 错误1:序列化类型为“...”的对象时检测到循环引用. 错误2:Self referencing loop detected f ...

随机推荐

  1. LayoutDemo

    package swing.ui; import java.awt.BorderLayout; import java.awt.GridLayout; import javax.swing.JButt ...

  2. mysql_install_db出错,Unable to lock /usr/local/mysql/var/ibdata1, error: 11

    今天,在一台旧机器上编译一个新的Mysql,install时出了错: /usr/local/mysql_5615/scripts/mysql_install_db --user=mysql --bas ...

  3. Android提高第二篇之SurfaceView的基本使用

    本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上次介绍MediaPlayer的时候略微介绍了SurfaceView,SurfaceView因为能够直接从内存 ...

  4. HDU2647(拓扑排序+反向建图)

    题意不说了,说下思路. 给出的关系是a要求的工资要比b的工资多,因为尽可能的让老板少付钱,那么a的工资就是b的工资+1.能够确定关系为a>b,依据拓扑排序建边的原则是把"小于" ...

  5. capturing self strongly in this block is likely to lead to a retain cycle

    一个用Block实例变量语法,当有一个参考的实例变量,常引起retain cycle. capturing self strongly in this block is likely to lead ...

  6. MKMapView移动事件地图

    MKMapView移动事件地图 by 吴雪莹 -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated { ...

  7. C++实现链表

    最后几天留在Intel,没什么事情,都是开开会.趁着闲功夫,把数据结构复习一下,写了一个list.时间仓促,有些地方考虑的可能没那么到位,望高手们指点. #include <iostream&g ...

  8. 续x奇数倍(n+2*x)暴力算法是冠军的算法结合数量

    // 续6单a,a+2,a+4,a+6,a+8,a+10是共同的数.最低要求a // 暴力解决方案 首先对结果,后面将代码粘贴: 1次连续n=9,连续值个数: 1;耗时: 0ms,总计: 0ms 2次 ...

  9. 对“demo!demo.Index+HookProc::Invoke”垃圾收集的类型已委托回调。这可能会导致应用程序崩溃、损坏和数据丢失。当传递委托给非托管代码,托管应用程序必须让这些委托保持活着

    对"demo!demo.Index+HookProc::Invoke"垃圾收集的类型已委托回调.这可能会导致应用程序崩溃.损坏和数据丢失.当传递委托给非托管代码,托管应用程序必须承 ...

  10. Installshield自动安装IIS组件

    原文:Installshield自动安装IIS组件 一. 工程类型:IS2010 installscript 二.原理: 1. XP和 Server2003系统:由于系统默认没有自带IIS组件,一般情 ...