当前位置: 67677新澳门葡京 > 科技报道 > 正文

框架前期利用Newtonsoft,JsonResult序列化结果

时间:2019-11-09 20:22来源:科技报道
一. 背景 .netmvc服务器段重返json数据利用的是System.Web.Script.塞里alization进行种类化的,然则.net自带的连串化学工业具未有Newtonsoft.Json第三方好用,大家后天来使Newtonsoft.Json替换用JsonRe

一. 背景

.net mvc服务器段重返json数据利用的是System.Web.Script.塞里alization进行种类化的,然则.net自带的连串化学工业具未有Newtonsoft.Json第三方好用,大家后天来使Newtonsoft.Json替换用JsonResult,塑造归于自身的jsonResult。

自定义ASP.NET MVC JsonResult类别化结果

自定义ASP.NET MVC 调节器和JsonResult类

 

近年项目中前台页面使用EasyUI的jQuery插件开采中遇到,EasyUI Form中的Datebox组件绑定ASP.NET MVC重回的DateTime类型的数量失实,因为ASP.NET MVC重临的DateTime类型的JsonResult的结果中的值是"/Date(277630788015)/",于是EasyUI显示的就是回去的值,没有将日期转变,直接体现在DateBox组件中,杀绝这些标题实际上有二种办法:

  1. 扩充EasyUI的datebox组件的parser函数自定义格式化日期格式,然而存在多少个难点是只要选择form.load数据是先将值赋给datebox不会调用datebox的parser方法,唯有在加载完form后再变动datebox的值为”二〇一三-11-3”格式的值;
  2. 第三种方式便是本文要讲得校勘ASP.NET MVC的Json连串化方法,也正是改良JsonResult的系列化方法,下边就来详细说下这种艺术。

 

首先看下ASP.NET MVC中的Controller的 Json方法的源码:

        protected internal JsonResult Json(object data) {

            return Json(data, null /* contentType */);

        }

 

        protected internal JsonResult Json(object data, string contentType) {

            return Json(data, contentType, null /* contentEncoding */);

        }

 

        protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding) {

            return new JsonResult {

                Data = data,

                ContentType = contentType,

                ContentEncoding = contentEncoding

            };

        }

能够看来关键依旧在JsonResult那个结果类中,JsonResult类的源码如下:

 

    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]

    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]

    public class JsonResult : ActionResult {

 

        public Encoding ContentEncoding {

            get;

            set;

        }

框架前期利用Newtonsoft,JsonResult序列化结果。 

        public string ContentType {

            get;

            set;

        }

 

        public object Data {

            get;

            set;

        }

 

        public override void ExecuteResult(ControllerContext context) {

            if (context == null) {

                throw new ArgumentNullException("context");

            }

 

            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) {

#pragma warning disable 0618

                JavaScriptSerializer serializer = new JavaScriptSerializer();

                response.Write(serializer.Serialize(Data));

#pragma warning restore 0618

            }

        }

    }

}

寻访这里大家应该肯定大家的修正指标了,对,正是ExecuteResult那几个法子,那些办法是连串化Data对象为Json格式的,可以见到ASP.NET MVC 使用的是System.Web.Script.Serialization.JavaScriptSerializer类

既然明显了目的,那么就起来动手吧。

1. 扩大JsonResult类自定义个CustomJsonResult类,重写ExecuteResult方法代码如下:

    public class CustomJsonResult:JsonResult

    {

        public override void ExecuteResult(ControllerContext context)

        {

            if (context == null)

            {

                throw new ArgumentNullException("context");

            }

 

            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)

            {

#pragma warning disable 0618

              

                response.Write(JsonConvert.SerializeObject(Data));

#pragma warning restore 0618

            }

        }

在MVC框架中,大家只怕时时会用到 return Json(),而Json方法内部又是三个JsonResult类,那么JsonResult内部又是怎么着规律呢?在MVC框架中,各类xxxResult便捷了大家的付出,但这个都不是本节的第意气风发,在此间我们只须要知道JsonResult内部的法规就可以。

切实的代码如下

咱俩运用的是Newtonsoft.Json.JsonConvert类种类化对象为Json的,具体聚集.NET中的系列化比较能够参照他事他说加以考查小说:在.NET使用JSON作为数据沟通格式

 

  1. 扩展Controller重写Json方法,代码如下:

    public class BaseController:Controller

    {

        protected override JsonResult Json(object data, string contentType, Encoding contentEncoding)

        {

            return new CustomJsonResult

            {

                Data = data,

                ContentType = contentType,

                ContentEncoding = contentEncoding

            };

        }

}

上边就是我们实际利用方式了,因为Newtonsoft.Json.JsonConvert类DateTime类型能够内定系列化日期的类型为: [JsonConverter(typeof(IsoDateTimeConverter))], [JsonConverter(typeof(JavaScriptDateTimeConverter))]

[JsonConverter(typeof(IsoDateTimeConverter))]体系化后的格式为:壹玖捌壹-03-16T00:20:12.1875 08:00

[JsonConverter(typeof(JavaScriptDateTimeConverter))]类别化后的格式为:new Date(-277630787812)

于是乎咱们钦定实体类的DateTime属性为IsoDate提姆eConverter,代码如下:

 

       [Field("P_Date", "更新日期")]

       [JsonConverter(typeof(IsoDateTimeConverter))]

       public DateTime P_Date { get; set; }

调节器世袭自BaseController,Action的回来结果照旧JsonResult格式,代码如下:

    public class GoodsController:BaseController

{

        public JsonResult List(string page, string rows)

        {

            Page thepage = new Page() { PageSize = 20, CurrentPage = 1 };

            if (!String.IsNullOrEmpty(rows))

            {

                thepage.PageSize = Convert.ToInt32(rows);

            }

 

            if (!String.IsNullOrEmpty(page))

            {

                thepage.CurrentPage = Convert.ToInt32(page);

            }

            Dictionary<string, object> result = new Dictionary<string, object>();

            result.Add("rows", new BusinessLogic().SelectByPage<GoodsList>(ref thepage));

            result.Add("total", thepage.SumCount);

 

            return Json(result);

        }

}

 

JsonResult内部原理是基于 JavaScriptSerializer来做的系列化,在动用进程中,有那样多少个缺陷:

累积援用

①:DateTime类型再次回到给前端格式不友善:/Date(1535009968228)/ ,卓越别扭。(PS:前端有大多方法管理的卡塔尔国

[csharp] view plain copy

②:对于前端来说,对于属性名大概更赞成于小写起来,但在C#中,比超级多都是大写,但JsonResult将原结果私下认可再次来到给前端,前端职员恐怕会有一点点小不爽。(PS:这也得以算作是叁个数见不鲜难题,未有刚毅的是非)

 

③:循环援引的主题素材。

  1. using System;  
  2. using System.IO;  
  3. using System.Text;  
  4. using System.Web.Mvc;  
  5. using Aft.Build.Common;  
  6. using Newtonsoft.Json;  
  7. using Newtonsoft.Json.Serialization;  

关于使用Newtonsoft.Json改变MVC默许的JsonResult,有很各类办法,本节仅是整合治理了风流浪漫晃在本身常常支出中的使用方法。(PS:这里的MVC版本为: 5.2.4.0卡塔尔国

[csharp] view plain copy

此处大致的剖释一下JsonResult的源码:

 

①:继承了ActionResult, 实现了ExecuteResult方法。

 图片 1图片 2

②:解读源码可以知道,JsonResult内部得以完毕原理是调用了JavaScriptSerializer对象中的Serialize方法,将Json对象转变来了Json字符串,通过:response.Write(javaScriptSerializer.Serialize(this.Data)); 传递给前台。

  1. public class JsonNetResult : JsonResult  
  2.     {  
  3.         public JsonNetResult()  
  4.         {  
  5.             Settings = new JsonSerializerSettings  
  6.             {  
  7.                 ReferenceLoopHandling = ReferenceLoopHandling.Error  
  8.             };  
  9.         }  
  10.         public JsonNetResult(object data, JsonRequestBehavior behavior = JsonRequestBehavior.AllowGet, string contentType = null, Encoding contentEncoding = null)  
  11.         {  
  12.             Data = data;  
  13.             JsonRequestBehavior = behavior;  
  14.             ContentEncoding = contentEncoding;  
  15.             ContentType = contentType;  
  16.         }  
  17.   
  18.         private JsonSerializerSettings _settings;  
  19.         public JsonSerializerSettings Settings  
  20.         {  
  21.             get  
  22.             {  
  23.                 _settings = _settings ?? new JsonSerializerSettings();  
  24.                 _settings.ContractResolver = new CamelCasePropertyNamesContractResolver();  
  25.                 return _settings;  
  26.             }  
  27.             private set { _settings = value; }  
  28.         }  
  29.   
  30.         public override void ExecuteResult(ControllerContext context)  
  31.         {  
  32.   
  33.             if (context == null)  
  34.                 throw new ArgumentNullException("context");  
  35.             if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))  
  36.                 throw new InvalidOperationException("JSON GET is not allowed");  
  37.             var response = context.HttpContext.Response;  
  38.             response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;  
  39.   
  40.             if (ContentEncoding != null)  
  41.                 response.ContentEncoding = ContentEncoding;  
  42.             if (Data == null)  
  43.                 return;  
  44.             var scriptSerializer = JsonSerializer.Create(Settings);  
  45.             using (var sw = new StringWriter())  
  46.             {  
  47.                 scriptSerializer.Serialize(sw, Data);  
  48.                 response.Write(sw.ToString());  
  49.             }  
  50.         }  
  51.     }  

③:暗许是防止Get诉求访谈的. JsonRequestBehavior.DenyGet。

此间笔者使用Newtonsoft.Json的 ContractResolver是CamelCasePropertyNamesContractResolver(即大小写格式卡塔尔国举行连串化数据。

④:在MVC的Action中,return Json(),这里的Json通过源码可以见到,即new了三个JsonResult对象而已,並且MVC中封装了众多种载。

 

图片 3

应用办法就跟使用jsonResult情势同样。

图片 4

不过每一趟使用new jsonResult这种艺术真正很讨厌,作者盼望能在mvc controller  action中使用json方法大器晚成致重返三个json数据。

本节关系到的知识点有:

接下去大家写多个controller扩展方法,具体代码实现如下:

1. MVC中的各个Result,可参照他事他说加以考察:

 

2. MVC中的过滤器,可参照他事他说加以考查:

[csharp] view plain copy

二. 测试JsonResult的弊端

 

此间关键测量试验一下DateTime类型“乱码”难题和暗中认可大小写标题。

 图片 5图片 6

后台代码: 1 public ActionResult Json1()

  1. <pre name="code" class="csharp">using System;  
  2. using System.Linq;  
  3. using System.Web.Mvc;  
  4. using Aft.Build.MvcWeb.Models;  
  5.   
  6. namespace Aft.Build.MvcWeb.Common.Extensions  
  7. {  
  8.     public static class ControllerExtensions  
  9.     {  
  10.         public static ActionResult JsonNetResult(this Controller controller, Object data)  
  11.         {  
  12.             return new JsonNetResult(data);  
  13.         }  
  14.         public static ActionResult JsonNetResult<T>(this Controller controller, IQueryable<T> query, KendoPagedFilter filter)  
  15.         {  
  16.             var data = DataSourceResult<T>.From(query, filter);  
  17.             return controller.JsonNetResult(data);  
  18.         }  
  19.     }  
  20. }  

2 {

 

3 var msg = new

接收方式:

4 {

 

5 ID = 1,

增加援用:

6 Name = "ypf1",

1.把扩展所在的地点增添引用

7 time = DateTime.Now

[csharp] view plain copy

8 };

 

9 return Json;

 图片 7图片 8

10 }

  1. using Aft.Build.MvcWeb.Common.Extensions;  

前台代码:1 $.on("click", function () {

[csharp] view plain copy

2 $.post("Json1", {}, function {

 

3 console.log;

 图片 9图片 10

4 });

  1. [澳门皇家堵场上线啦网址 ,HttpPost]  
  2.        public ActionResult List(SearchFilter filter)  
  3.        {  
  4.            var query = _countryRepository.AsQueryable();  
  5.            if (!string.IsNullOrEmpty(filter.Name))  
  6.            {  
  7.                query = query.Where(e => e.Name.Contains(filter.Name));  
  8.            }  
  9.            return this.JsonNetResult(query, filter);  
  10.        }  

5 });

或者是

测量检验结果:

 

图片 11

 

上边提供生机勃勃种缓慢解决岁月戳转变的主题素材,使用该js文件,对Date类型进行扩展,代码如下: 1 /**

[csharp] view plain copy

2 * 对Date的恢宏,将 Date 转变为钦点格式的String

 

3 * 月、12钟头、24钟头、秒、季度 能够用 1-2 个占位符

 图片 12图片 13

4 * 年得以用 1-4 个占位符,纳秒只可以用 1 个占位符(是 1-3 位的数字)

  1. [HttpPost]  
  2.         public ActionResult Update(ObjectId id, Employee employee)  
  3.         {  
  4.             employee.Id = id;  
  5.             var result = _employeeTask.Save(employee);  
  6.             return this.JsonNetResult(result);  
  7.         }  

5 * eg:

再也许是:

6 * (new Date.pattern("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423

 

7 * (new Date.pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04

 

8 * (new Date.pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04

[csharp] view plain copy

9 * (new Date.pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04

 

10 * (new Date.pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18

 图片 14图片 15

11

  1. [HttpPost]  
  2.         public ActionResult Del(ObjectId id)  
  3.         {  
  4.             _countryRepository.Delete(id);  
  5.             return new JsonNetResult(true);  
  6.         }  

12 使用:(eval(value.replace(//Date\//gi, "new Date.pattern("yyyy-M-d h:m:s.S");

如此那般,总算是旗开马到了。

13

 

14 */

总结:

15 Date.prototype.pattern = function {

1.mvc默许使用Json方法是在controller中接受JsonResult来回到json数据的。

16 var o = {

2.前端json数据运用大小写格式越发标准,特别契合命名标准。

17 "M ": this.getMonth() 1, //月份

 

18 "d ": this.getDate(), //日

转自:

19 "h ": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时

20 "H ": this.getHours(), //小时

21 "m ": this.getMinutes(), //分

22 "s ": this.getSeconds(), //秒

23 "q ": Math.floor((this.getMonth / 3), //季度

24 "S": this.getMilliseconds() //毫秒

25 };

26 var week = {

27 "0": "/u65e5",

28 "1": "/u4e00",

29 "2": "/u4e8c",

30 "3": "/u4e09",

31 "4": "/u56db",

32 "5": "/u4e94",

33 "6": "/u516d"

编辑:科技报道 本文来源:框架前期利用Newtonsoft,JsonResult序列化结果

关键词: 第三节 框架 Newtonsoft MVC 开发手