JS实现JSON.stringify

来源:互联网 发布:烟台龙口淘宝招聘网 编辑:程序博客网 时间:2024/05/20 07:51
JSON.stringify是浏览器高版本带的一个将JS的Objtect对象转换为JSON字符串的一个方法,不过再IE6下面,并不存在JSON这一对象,因此,用到此方法时,需要写一套兼容性的代码。 JSON.stringify的一些规则以及注意点:当对象为数字,null,boolean的时候,直接转换为相应的字符串就可以了。但是string,function,undefined,object,array等,需要特殊处理。 



1.undefined,该类型使用JSON.stringify处理的时候,如果对象就是undefined,将会输出"undefined",如果对象是数组的元素,那么将会变成null,比如:[undefined],stringify之后变成了"[null]";如果该对象是object的元素,那么该属性将当作不存在,不输出,比如{a:1,b:undefined},stringify之后是"{\"a\":1},B属性直接抛弃。 



2.字符串在拼接的时候需要把内部的双引号处理掉 


代码如下 

Java代码  收藏代码
  1. /** 
  2.  * JSON stringify的实现 
  3.  * @author norkts<norkts@gmail.com> 
  4.  * @version 1.0 2015-11-24 15:11 实现了基本功能 
  5.  * @version 1.1 2015-11-24 15:19 norkts 增加了JSON.stringify的兼用代码实现 
  6.  * @version 1.2 2015-11-24 15:49 norkts 修改数组indexOf在IE下不兼容的写法,修改了undefined值的特殊处理 
  7.  */  
  8. (function(NS){  
  9.   
  10.     //简单类型  
  11.     var simpleTypes = ["number""boolean""undefined""string""function"];  
  12.       
  13.     //JSON.stringify的主函数  
  14.     function stringify(object){  
  15.         var type = typeof object;  
  16.           
  17.         //如果是简单类型,则直接返回简单类型的结果  
  18.         if(indexOf(simpleTypes, type) > -1){  
  19.             return parseSimpleObject(object);  
  20.         }  
  21.   
  22.         //数组对象的  
  23.         if(object instanceof Array){  
  24.             var len = object.length;  
  25.             var resArr = [];  
  26.             for(var i = 0; i < len; i++){  
  27.                 var itemType = typeof object[i];  
  28.                 if(indexOf(simpleTypes, itemType) > -1){  
  29.   
  30.                     //undefined特殊处理,数组中变成null  
  31.                     if(itemType !=  "undefined"){  
  32.                         resArr.push(parseSimpleObject(object[i]));  
  33.                     }else{  
  34.                         resArr.push("null");  
  35.                     }  
  36.                       
  37.                 }else{  
  38.                     //递归处理JS数组中的复杂元素  
  39.                     resArr.push(stringify(object[i]));  
  40.                 }  
  41.             }  
  42.               
  43.             return "[" + resArr.join(",") + "]";  
  44.         }  
  45.           
  46.         //普通object对象  
  47.         if(object instanceof Object){  
  48.             if(object == null){  
  49.                 return "null";  
  50.             }  
  51.               
  52.             var resArr = [];  
  53.               
  54.             for(var name in object){  
  55.                 var itemType = typeof object[name];  
  56.                 if(indexOf(simpleTypes, itemType) > -1){  
  57.                     //undefined特殊处理,object中不编码  
  58.                     if(itemType !=  "undefined"){  
  59.                         resArr.push("\"" + name + "\":" + parseSimpleObject(object[name]));      
  60.                     }  
  61.                 }else{  
  62.                     resArr.push("\"" + name + "\":" + stringify(object[name]));  
  63.                 }  
  64.             }  
  65.               
  66.             return "{" + resArr.join(",") + "}";  
  67.         }  
  68.     }  
  69.       
  70.     function parseSimpleObject(object){  
  71.         var type = typeof object;  
  72.         if(type == "string" || type == "function"){  
  73.             return "\"" + object.toString().replace("\"""\\\"") + "\"";  
  74.         }  
  75.           
  76.         if(type == "number" || type == "boolean"){  
  77.             return object.toString();  
  78.         }  
  79.           
  80.         if(type == "undefined"){  
  81.             return "undefined";  
  82.         }  
  83.           
  84.         return "\"" + object.toString().replace("\"""\\\"") + "\"";  
  85.     }  
  86.       
  87.     function indexOf(arr, val){  
  88.         for(var i = 0; i < arr.length; i++){  
  89.             if(arr[i] === val){  
  90.                 return i;  
  91.             }  
  92.         }  
  93.           
  94.         return -1;  
  95.     }  
  96.       
  97.     /** 
  98.      * 将stringify做二次封装 
  99.      * @param object 要处理的对象 
  100.      * 
  101.      */  
  102.     NS.stringify = function(object, isEncodeZh){  
  103.         var res = stringify(object);  
  104.         if(isEncodeZh){  
  105.             var encodeRes = "";  
  106.             for(var i = 0; i < res.length; i++){  
  107.                 if(res.charCodeAt(i) < 0xff){  
  108.                     encodeRes += res[i];  
  109.                 }else{  
  110.                     encodeRes += "\\u" + res.charCodeAt(i).toString(16);  
  111.                 }  
  112.             }  
  113.             res = encodeRes;  
  114.         }  
  115.           
  116.         return res;  
  117.     };  
  118. })(window);  
0 0