java json.stringify_JavaScript如何实现JSON.stringify

JavaScript如何实现JSON.stringify

导语:JavaScript如何实现JSON.stringify呢?通过下面教程大家会有所收获,更多详情请关注应届毕业生考试网。

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.字符串在拼接的时候需要把内部的.双引号处理掉

代码如下

/**

* JSON stringify的实现

* @author norkts

* @version 1.0 2015-11-24 15:11 实现了基本功能

* @version 1.1 2015-11-24 15:19 norkts 增加了JSON.stringify的兼用代码实现

* @version 1.2 2015-11-24 15:49 norkts 修改数组indexOf在IE下不兼容的写法,修改了undefined值的特殊处理

*/

(function(NS){

//简单类型

var simpleTypes = ["number", "boolean", "undefined", "string", "function"];

//JSON.stringify的主函数

function stringify(object){

var type = typeof object;

//如果是简单类型,则直接返回简单类型的结果

if(indexOf(simpleTypes, type) > -1){

return parseSimpleObject(object);

}

//数组对象的

if(object instanceof Array){

var len = object.length;

var resArr = [];

for(var i = 0; i < len; i++){

var itemType = typeof object[i];

if(indexOf(simpleTypes, itemType) > -1){

//undefined特殊处理,数组中变成null

if(itemType != "undefined"){

resArr.push(parseSimpleObject(object[i]));

}else{

resArr.push("null");

}

}else{

//递归处理JS数组中的复杂元素

resArr.push(stringify(object[i]));

}

}

return "[" + resArr.join(",") + "]";

}

//普通object对象

if(object instanceof Object){

if(object == null){

return "null";

}

var resArr = [];

for(var name in object){

var itemType = typeof object[name];

if(indexOf(simpleTypes, itemType) > -1){

//undefined特殊处理,object中不编码

if(itemType != "undefined"){

resArr.push("\"" + name + "\":" + parseSimpleObject(object[name]));

}

}else{

resArr.push("\"" + name + "\":" + stringify(object[name]));

}

}

return "{" + resArr.join(",") + "}";

}

}

function parseSimpleObject(object){

var type = typeof object;

if(type == "string" || type == "function"){

return "\"" + object.toString().replace("\"", "\\\"") + "\"";

}

if(type == "number" || type == "boolean"){

return object.toString();

}

if(type == "undefined"){

return "undefined";

}

return "\"" + object.toString().replace("\"", "\\\"") + "\"";

}

function indexOf(arr, val){

for(var i = 0; i < arr.length; i++){

if(arr[i] === val){

return i;

}

}

return -1;

}

/**

* 将stringify做二次封装

* @param object 要处理的对象

*

*/

NS.stringify = function(object, isEncodeZh){

var res = stringify(object);

if(isEncodeZh){

var encodeRes = "";

for(var i = 0; i < res.length; i++){

if(res.charCodeAt(i) < 0xff){

encodeRes += res[i];

}else{

encodeRes += "\\u" + res.charCodeAt(i).toString(16);

}

}

res = encodeRes;

}

return res;

};

})(window);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Asp 这个老古懂估计没几个人在用了。几年没写代码了,最近要弄个小东西,给手机端提供json数据,不想麻烦别人,自己又只会asp,没办法就自己动手了。网上找了好久都没有一个人能完整的把asp操作json说清楚。最后还是自己搞定的。整出来共享给大家。(ps,还有个原因csdn的分不够用啦,大家看着给点吧。写这个说明文档都用了我两小时。^_^) 以下是示例代码 '说明:json.asp中引用了json.js.asp '其他见文档 '手机很多时候不认gb2312,跳入json的坑就忘记gb2312吧,讨厌的是,如果代码报错,iis会输出gb2312,结果就是乱码,有点烦。 '自己想办法解决吧 response.Charset= "utf-8" dim strJsonData,ovbJson,j dim arrTemp,varname ,i set ovbJson=new vbJson 'asp recrodset和数组转json字符 arrTemp=array("a","{""oa"":""我是oa""}","c") strJsonData=ovbjson.toJson(empty,arrTemp,true) '转换为Json格式的字符串,有兴趣可以自己输出看看是什么 set j=json.parse(strJsonData) '序列化为json对象(或者是数组对象) response.Write(j.get(1)&"") '别用vb数组来存json对象,不然得每个元素去重新序列化,这里如果想j.get(1).oa就不行了。必须对j.get(1)单独序列才行 '----recrodset就不演示了,懒得连数据库 '---自定义操作方法的演示--- strJsonData="{a:1,b:[{c:'我是数组中的点c'}]}" set j=json.parsestr(strJsonData) response.Write(j.b.get(0).c&"") '添加节点的时候注意,如果值是null,会被忽然,这个节点会不存在的。在添加之前记得先检查值 set j=json.add(j,"new","我是新加的节点") response.Write(j.new&"") '下面这句注掉了,是因为这个操作是无效的因为j.b是数组,不能add 'set j=json.add(j.b,"new1","我是加不进的节点") set j.b=j.b.put(j.b.length,j.b.get(0)) response.Write(j.b.get(1).c&",我是新加的数组元素") '因为数组的get方法不允许被赋值,所以不能像下面这样写 'set j.b.get(0)=json.add(j.b.get(0),"new","我会报错") json.add j.b.get(0),"new","我是新加的new我不会报错" json.add j.b.get(0),"new1","我是通过变量取出来的哦" response.Write(j.b.get(0).new&"") varname="new1" response.Write(json.byname(j.b.get(0),varname)&"") for i=0 to j.b.length-1 varname="c" response.Write(json.byname(j.b.get(i),varname)&"我是循环出来的c,索引:"&i&" ") next '最后完整的输出给手机就这样: response.Write json.stringify(j)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值