博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
超高性能的json序列化之MVC中使用Json.Net
阅读量:6764 次
发布时间:2019-06-26

本文共 8766 字,大约阅读时间需要 29 分钟。

先不废话,直接上代码

Asp.net MVC自带Json序列化

1 ///  2 /// 加载组件列表 3 ///  4 /// 作业部/厂 5 /// 组件Id 6 /// 标签号 7 /// 当前页码 8 /// 每页条数 9 /// 
返回组件json数据
10 public JsonResult ListCom(long departmentId, IEnumberable
unitIds, string tag, int pageIndex, int pageSize) 11 { 12 var dataEntity = LdarService.ListCom(unitIds, tag, pageIndex + 1, pageSize); 13 var dataModel = new Page
{Total = dataEntity.Total}; 14 var data = 15 dataModel.DataList = 16 dataEntity.DataList.Select(model => Builder.Builder.Convert
(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 ///  2 /// 分区 3 ///  4 [JsonIgnore] 5 public LdAreaModel LdAreaModel { get; set; } 6 7 ///  8 /// 区域名称 9 ///  10 public string AreaName 11 { 12 get 13 { 14 return LdAreaModel.LdarAreaName; 15 } 16 }

 

使用JsonNet序列化

1 ///  2 /// 加载组件列表 3 ///  4 /// 作业部/厂 5 /// 组件Id 6 /// 标签号 7 /// 当前页码 8 /// 每页条数 9 /// 
返回组件json数据
10 public JsonResult ListCom(long departmentId, IEnumberable
unitIds, string tag, int pageIndex, int pageSize) 11 { 12 var dataEntity = LdarService.ListCom(unitIds, tag, pageIndex + 1, pageSize); 13 var dataModel = new Page
{Total = dataEntity.Total}; 14 var data = 15 dataModel.DataList = 16 dataEntity.DataList.Select(model => Builder.Builder.Convert
(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     ///  2     /// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 的 
对象。 3 ///
4 /// 5 ///
6 /// 将指定对象序列化为 JSON 格式的 JSON 结果对象。在执行此方法所准备的结果对象时,ASP.NET MVC 框架会将该对象写入响应。 7 ///
8 /// 要序列化的 JavaScript 对象图。 9 protected internal JsonResult Json(object data) 10 { 11 return this.Json(data, (string) null, (Encoding) null, JsonRequestBehavior.DenyGet); 12 } 13 14 // 15 /// 创建
对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。 16 ///
17 /// 18 ///
19 /// 将指定对象序列化为 JSON 格式的结果对象。 20 ///
21 /// 要序列化的 JavaScript 对象图。内容类型(MIME 类型)。内容编码。JSON 请求行为 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(...)

1 using System;  2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Web; 6 7 namespace System.Web.Mvc 8 { 9 public static class ControllerExt 10 { 11 ///  12 /// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 的 
对象。 13 ///
14 /// 15 ///
16 /// 将指定对象序列化为 JSON 格式的 JSON 结果对象。在执行此方法所准备的结果对象时,ASP.NET MVC 框架会将该对象写入响应。 17 ///
18 /// 控件器 19 /// 要序列化的 JavaScript 对象图。 20 public static JsonNetResult JsonNet(this Controller controller, object data) 21 { 22 return JsonNet(data, (string) null, (Encoding) null, JsonRequestBehavior.DenyGet); 23 } 24 25 /// 26 /// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式的
对象。 27 ///
28 /// 29 ///
30 /// 将指定对象序列化为 JSON 格式的 JSON 结果对象。 31 ///
32 /// 控件器 33 /// 要序列化的 JavaScript 对象图。 34 /// 内容类型(MIME 类型)。 35 public static JsonNetResult JsonNet(this Controller controller, object data, string contentType) 36 { 37 return JsonNet(data, contentType, (Encoding) null, JsonRequestBehavior.DenyGet); 38 } 39 40 /// 41 /// 创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式的
对象。 42 ///
43 /// 44 ///
45 /// 将指定对象序列化为 JSON 格式的 JSON 结果对象。 46 ///
47 /// 控件器 48 /// 要序列化的 JavaScript 对象图。 49 /// 内容类型(MIME 类型)。 50 /// 内容编码。 51 public static JsonNetResult JsonNet(this Controller controller, object data, string contentType, 52 Encoding contentEncoding) 53 { 54 return JsonNet(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet); 55 } 56 57 /// 58 /// 创建
对象,该对象使用指定 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。 59 ///
60 /// 61 ///
62 /// 将指定对象序列化为 JSON 格式的结果对象。 63 ///
64 /// 控件器 65 /// 要序列化的 JavaScript 对象图。 66 /// JSON 请求行为。 67 public static JsonNetResult JsonNet(this Controller controller, object data, JsonRequestBehavior behavior) 68 { 69 return JsonNet(data, (string) null, (Encoding) null, behavior); 70 } 71 72 /// 73 /// 创建
对象,该对象使用指定内容类型和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。 74 ///
75 /// 76 ///
77 /// 将指定对象序列化为 JSON 格式的结果对象。 78 ///
79 /// 控件器 80 /// 要序列化的 JavaScript 对象图。 81 /// 内容类型(MIME 类型)。 82 /// JSON 请求行为 83 public static JsonNetResult JsonNet(this Controller controller, object data, string contentType, 84 JsonRequestBehavior behavior) 85 { 86 return JsonNet(data, contentType, (Encoding) null, behavior); 87 } 88 89 /// 90 /// 创建
对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。 91 ///
92 /// 93 ///
94 /// 将指定对象序列化为 JSON 格式的结果对象。 95 ///
96 /// 控件器 97 /// 要序列化的 JavaScript 对象图。 98 /// 内容类型(MIME 类型)。 99 /// 内容编码。JSON 请求行为 100 public static JsonNetResult JsonNet(this Controller controller, object data, string contentType, 101 Encoding contentEncoding, JsonRequestBehavior behavior) 102 { 103 return JsonNet(data, contentType, contentEncoding, behavior); 104 } 105 106 /// 107 /// 创建
对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。 108 ///
109 /// 要序列化的 JavaScript 对象图。 110 /// 内容类型(MIME 类型)。 111 /// 内容编码。 112 /// 113 ///
JSON 请求行为
114 private static JsonNetResult JsonNet(object data, string contentType, Encoding contentEncoding, 115 JsonRequestBehavior behavior) 116 { 117 return new JsonNetResult() 118 { 119 Data = data, 120 ContentType = contentType, 121 ContentEncoding = contentEncoding, 122 JsonRequestBehavior = behavior 123 }; 124 } 125 126 } 127 }

 

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

1 using System.Text; 2 using Newtonsoft.Json; 3 4 namespace System.Web.Mvc 5 { 6 public class JsonNetResult : JsonResult 7 { 8 public Encoding ContentEncoding { get; set; } 9 public string ContentType { get; set; } 10 public object Data { get; set; } 11 12 public JsonSerializerSettings SerializerSettings { get; set; } 13 public Formatting Formatting { get; set; } 14 15 public JsonNetResult() 16 { 17 SerializerSettings = new JsonSerializerSettings(); 18 } 19 20 public override void ExecuteResult(ControllerContext context) 21 { 22 if (context == null) 23 throw new ArgumentNullException("context"); 24 25 HttpResponseBase response = context.HttpContext.Response; 26 27 response.ContentType = !string.IsNullOrEmpty(ContentType) 28 ? ContentType 29 : "application/json"; 30 31 if (ContentEncoding != null) 32 response.ContentEncoding = ContentEncoding; 33 34 if (Data != null) 35 { 36 var writer = new JsonTextWriter(response.Output) { Formatting = Formatting }; 37 38 JsonSerializer serializer = JsonSerializer.Create(SerializerSettings); 39 serializer.Serialize(writer, Data); 40 41 writer.Flush(); 42 } 43 } 44 } 45 }

 

封装后的JsonNet序列化

1 ///  2 /// 加载组件列表 3 ///  4 /// 作业部/厂 5 /// 组件Id 6 /// 标签号 7 /// 当前页码 8 /// 每页条数 9 /// 
返回组件json数据
10 public JsonNetResult ListCom(long departmentId, IEnumberable
unitIds, string tag, int pageIndex, int pageSize) 11 { 12 var dataEntity = LdarService.ListCom(listUnitId, tag, pageIndex + 1, pageSize); 13 var dataModel = new Page
{Total = dataEntity.Total}; 14 var data = 15 dataModel.DataList = 16 dataEntity.DataList.Select(model => Builder.Builder.Convert
(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(...)一样,非常方便。

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

转载于:https://www.cnblogs.com/lonsi/p/4243441.html

你可能感兴趣的文章
激活函数——sigmoid函数(理解)
查看>>
php ucwords 单词的首字母大写
查看>>
【爬虫】python 多线程知识
查看>>
由Cocos2dx的部分代码引出的对Lua元表的认识
查看>>
Spring Cloud构建微服务架构--服务网关
查看>>
hello oracle II
查看>>
vue2.0 仿手机新闻站(三)通过 vuex 进行状态管理
查看>>
AvalonJS前端开发源码
查看>>
oracle数据库查询通过一个待查询字段的值组装不同的条件
查看>>
关于数据库存放List
查看>>
3、继承与派生
查看>>
Wannafly summer camp Day2I(思维)
查看>>
正则表达式 小结
查看>>
docker基础
查看>>
MongoDB的安装与python操作MongoDB
查看>>
CF:The Fault in Our Cubes(DFS)
查看>>
[导入]WAP技术与网站建立
查看>>
STM32F4的sct文件理解
查看>>
6、消息发布和订阅功能
查看>>
P4233 射命丸文的笔记
查看>>