让JSON.js完全适应.NET
2015-05-17 22:40
148 查看
动机:.net 默认的时间序列化方式为\/Date(数字 时区)\/,序列化成JSON在前端很难处理,有没有一种好的处理方式呢?
改进:
至此,已经可以轻松搞定JSON时间处理的麻烦。不过这里有一点点不完美的地方,要求.NET端的时间使用UTC时间,总的来说这也不是什么大的缺陷,可以接受。我的理由是在多时区时就应当在服务端使用UTC时间。
改进:
JSON = new function(){ this.decode = function(){ var filter, result, self, tmp; if($$("toString")) { switch(arguments.length){ case 2: self = arguments[0]; filter = arguments[1]; break; case 1: if($[typeof arguments[0]](arguments[0]) === Function) { self = this; filter = arguments[0]; } else self = arguments[0]; break; default: self = this; break; }; if(rc.test(self)){ try{ result = e("(".concat(self, ")")); if(filter && result !== null && (tmp = $[typeof result](result)) && (tmp === Array || tmp === Object)){ for(self in result) result[self] = v(self, result) ? filter(self, result[self]) : result[self]; } } catch(z){} } else { throw new Error("bad data"); } }; return result; }; this.encode = function(){ var self = arguments.length ? arguments[0] : this, result, tmp; if(self === null) result = "null"; else if(self !== undefined && (tmp = $[typeof self](self))) { switch(tmp){ case Array: result = []; for(var i = 0, j = 0, k = self.length; j < k; j++) { if(self[j] !== undefined && (tmp = JSON.encode(self[j]))) result[i++] = tmp; }; result = "[".concat(result.join(","), "]"); break; case Boolean: result = String(self); break; 56 case Date: 57 result = '"\\/Date('.concat(self.valueOf(),')\\/"'); 58 break; case Function: break; case Number: result = isFinite(self) ? String(self) : "null"; break; case String: result = '"'.concat(self.replace(rs, s).replace(ru, u), '"'); break; default: var i = 0, key; result = []; for(key in self) { if(self[key] !== undefined && (tmp = JSON.encode(self[key]))) result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp); }; result = "{".concat(result.join(","), "}"); break; } }; return result; }; this.toDate = function(){ var self = arguments.length ? arguments[0] : this, result=self; if(rd.test(self)){ result = new Date(); result.setHours(i(self, 11, 2)); result.setMinutes(i(self, 14, 2)); result.setSeconds(i(self, 17, 2)); result.setMonth(i(self, 5, 2) - 1); result.setDate(i(self, 8, 2)); result.setFullYear(i(self, 0, 4)); } 92 //else if(rt.test(self)) 93 //result = new Date(self * 1000); 94 else if(rr.test(self)){ 95 result=new Date(self.match(/\d+/)[0]-0); 96 } return result; }; 100 this.defaultDateFilter=function(k,m){ // 提供通用的时间字符串解析方式(尽可能利用原有处理机制,这一过程较消耗性能,需要解析时间时使用filter) 101 switch($[typeof m](m)){ 102 case Array: 103 case Object: 104 for(var p in m){ 105 m[p]=v(p,m)?arguments.callee(p,m[p]):m[p]; 106 } 107 return m; 108 case String: 109 return JSON.toDate(m); 110 default: 111 return m; 112 } 113 } var c = {"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"}, d = function(n){return n<10?"0".concat(n):n}, e = function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f}, i = function(e,p,l){return 1*e.substr(p,l)}, p = ["","000","00","0",""], rc = null, rd = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/, rs = /(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g, 122 rr=/^\/Date\(\d+\)\/$/, rt = /^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/, ru = /([\x00-\x07]|\x0b|[\x0e-\x1f])/g, s = function(i,d){return "\\".concat(c[d])}, u = function(i,d){ var n=d.charCodeAt(0).toString(16); return "\\u".concat(p[n.length],n) }, v = function(k,v){return $[typeof v[k]](v[k])!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])}, $ = { "boolean":function(){return Boolean}, "function":function(){return Function}, "number":function(){return Number}, "object":function(o){return o instanceof o.constructor?o.constructor:null}, "string":function(){return String}, "undefined":function(){return null} }, $$ = function(m){ function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}}; return $(Array)&&$(Object) }; try{rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')} catch(z){rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/} };
至此,已经可以轻松搞定JSON时间处理的麻烦。不过这里有一点点不完美的地方,要求.NET端的时间使用UTC时间,总的来说这也不是什么大的缺陷,可以接受。我的理由是在多时区时就应当在服务端使用UTC时间。
相关文章推荐
- json 操作(js和asp.net)
- Microshaoft Cross-Domain + ASP.NET MVC 5 WebAPI 2 + Self-Host + JsonpMediaTypeFormatter + WCF + JsonP + PerformaceCounterFilter + Knockout.js + MVVM
- 用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
- asp.net后台cs中的JSON格式变量在前台Js中调用方法(前后台示例代码)
- 关于asp.net 引用外部js文件或者json文件中文乱码的问题
- 当json.js遇见dynamic.net [0]
- asp.net后台cs中的JSON格式变量在前台Js中调用方法!(前后台实例!)
- asp.net利用json填充下拉框及js动态添加表格行、删除表格行的示例
- 。net 后台将List数据转换为json后 前台js 调用
- asp.net中json格式化及在js中解析json
- Asp.net/Jquery/JS中各种数据转换为【JSON数据格式】的类!(相当好,转)
- JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- asp.net 使用ajax请求地址接口数据 ajax返回类型是json js get post请求数据
- net.sf.json.JSONArray 转换的Json 在非Ajax中如何转换成js对象
- asp.net后台cs中的JSON格式变量在前台Js中调用方法(前后台示例代码)
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
- \t\tasp.net MVC 结合 jquery.autocomplete.js使用json返回数据
- Ext.Net Js调用WebService方法以json对象传递参数