首页 > 网站 > WEB开发 > 正文

让JSON.js完全适应.NET

2024-04-27 14:09:18
字体:
来源:转载
供稿:网友

让JSON.js完全适应.NET

动机:.net 默认的时间序列化方式为//Date(数字 时区)//,序列化成JSON在前端很难处理,有没有一种好的处理方式呢?

改进:

  1 JSON = new function(){  2     this.decode = function(){  3         var    filter, result, self, tmp;  4         if($$("toString")) {  5             switch(arguments.length){  6                 case    2:  7                     self = arguments[0];  8                     filter = arguments[1];  9                     break; 10                 case    1: 11                     if($[typeof arguments[0]](arguments[0]) === Function) { 12                         self = this; 13                         filter = arguments[0]; 14                     } 15                     else 16                         self = arguments[0]; 17                     break; 18                 default: 19                     self = this; 20                     break; 21             }; 22             if(rc.test(self)){ 23                 try{ 24                     result = e("(".concat(self, ")")); 25                     if(filter && result !== null && (tmp = $[typeof result](result)) && (tmp === Array || tmp === Object)){ 26                         for(self in result) 27                             result[self] = v(self, result) ? filter(self, result[self]) : result[self]; 28                     } 29                 } 30                 catch(z){} 31             } 32             else { 33                 throw new Error("bad data"); 34             } 35         }; 36         return result; 37     }; 38     this.encode = function(){ 39         var    self = arguments.length ? arguments[0] : this, 40             result, tmp; 41         if(self === null) 42             result = "null"; 43         else if(self !== undefined && (tmp = $[typeof self](self))) { 44             switch(tmp){ 45                 case    Array: 46                     result = []; 47                     for(var    i = 0, j = 0, k = self.length; j < k; j++) { 48                         if(self[j] !== undefined && (tmp = JSON.encode(self[j]))) 49                             result[i++] = tmp; 50                     }; 51                     result = "[".concat(result.join(","), "]"); 52                     break; 53                 case    Boolean: 54                     result = String(self); 55                     break; 56                 case    Date: 57                     result = '"///Date('.concat(self.valueOf(),')///"'); 58                     break; 59                 case    Function: 60                     break; 61                 case    Number: 62                     result = isFinite(self) ? String(self) : "null"; 63                     break; 64                 case    String: 65                     result = '"'.concat(self.replace(rs, s).replace(ru, u), '"'); 66                     break; 67                 default: 68                     var    i = 0, key; 69                     result = []; 70                     for(key in self) { 71                         if(self[key] !== undefined && (tmp = JSON.encode(self[key]))) 72                             result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp); 73                     }; 74                     result = "{".concat(result.join(","), "}"); 75                     break; 76             } 77         }; 78         return result; 79     }; 80     this.toDate = function(){ 81         var    self = arguments.length ? arguments[0] : this, 82             result=self; 83         if(rd.test(self)){ 84             result = new Date(); 85             result.setHours(i(self, 11, 2)); 86             result.setMinutes(i(self, 14, 2)); 87             result.setSeconds(i(self, 17, 2)); 88             result.setMonth(i(self, 5, 2) - 1); 89             result.setDate(i(self, 8, 2)); 90             result.setFullYear(i(self, 0, 4)); 91         } 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         } 97         return result; 98     }; 99     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     }114     var    c = {"/b":"b","/t":"t","/n":"n","/f":"f","/r":"r",'"':'"',"//":"//","/":"/"},115         d = function(n){return n<10?"0".concat(n):n},116         e = function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f},117         i = function(e,p,l){return 1*e.substr(p,l)},118         p = ["","000","00","0",""],119         rc = null,120         rd = /^[0-9]{4}/-[0-9]{2}/-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,121         rs = /(/x5c|/x2F|/x22|[/x0c-/x0d]|[/x08-/x0a])/g,122         rr=/^//Date/(/d+/)//$/,123         rt = /^([0-9]+|[0-9]+[,/.][0-9]{1,3})$/,124         ru = /([/x00-/x07]|/x0b|[/x0e-/x1f])/g,125         s = function(i,d){return "//".concat(c[d])},126         u = function(i,d){127             var    n=d.charCodeAt(0).toString(16);128             return "//u".concat(p[n.length],n)129         },130         v = function(k,v){return $[typeof v[k]](v[k])!==Function&&(v.hasOwnPRoperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},131         $ = {132             "boolean":function(){return Boolean},133             "function":function(){return Function},134             "number":function(){return Number},135             "object":function(o){return o instanceof o.constructor?o.constructor:null},136             "string":function(){return String},137             "undefined":function(){return null}138         },139         $$ = function(m){140             function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};141             return $(Array)&&$(Object)142         };143     try{rc=new RegExp('^("(////.|[^"//////n//r])*?"|[,:{}//[//]0-9.//-+Eaeflnr-u //n//r//t])+?$')}144     catch(z){rc=/^(true|false|null|/[.*/]|/{.*/}|".*"|/d+|/d+/./d+)$/}145 };

至此,已经可以轻松搞定JSON时间处理的麻烦。不过这里有一点点不完美的地方,要求.NET端的时间使用UTC时间,总的来说这也不是什么大的缺陷,可以接受。我的理由是在多时区时就应当在服务端使用UTC时间。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表