zoukankan      html  css  js  c++  java
  • 让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","	":"t","
    ":"n","f":"f","
    ":"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时间。

  • 相关阅读:
    转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
    转载:《理解OAuth 2.0》 阮一峰
    转载:《RESTful API 设计指南》 阮一峰
    转载:《理解RESTful架构》 阮一峰
    转载:2.2.5 在配置中使用变量《深入理解Nginx》(陶辉)
    转载:2.2.4 配置项的单位《深入理解Nginx》(陶辉)
    转载:2.2.3 配置项的注释《深入理解Nginx》(陶辉)
    SQL & PL/SQL 模块总结
    一些比较好的shellscript脚本
    11 高级优化技术
  • 原文地址:https://www.cnblogs.com/kingge/p/4510732.html
Copyright © 2011-2022 走看看