原生js实现JSON.parse()和JSON.stringify()

- 首先JSON.stringify()是将js对象转换为JSON形式

实现思路:

通过递归调用,来实现对转换对象Object的深层value进行遍历,利用array的join实现最终字符串拼接

function myJsonStringify(obj) {let type = typeof obj;if (type !== "object" || type === null) {if (/string|undefined|function/.test(type)) {obj = '"' + obj + '"';}return String(obj);} else {let json = [],arr = (obj && obj.constructor === Array);for (let k in obj) {let v = obj[k];let type = typeof v;if (/string|undefined|function/.test(type)) {v = '"' + v + '"';} else if (type === "object") {v = myJsonStringify(v);}json.push((arr ? "" : '"' + k + '":') + String(v));}return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}")}}

一个较为完整版的实现:

(function(NS){
var simpleTypes=["number","boolean","undefined","string","function"]
function stringify(object){var type=typeof objectif(indexOf(simpleTypes,type)>-1){return parseSimpleObject(object);}if(object instanceof Array){var len=object.length;var resArr=[];for(var i=0;i){var itemType=typeof object[i];if(indexOf(simpleTypes,itemType)>-1){if(itemType!="undefined"){resArr.push(parseSimpleObject(object[i]));}else{resArr.push('null')}}else{resArr.push(stringify(object[i]))}}return "["+resArr.join(",")+ "]"}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){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){if(arr[i]===val){return i;}}return -1
}
NS.stringify=function(object,isEncodeZh){var res=stringify(object)if(isEncodeZh){var encodeRes="";for(var i=0;i){if(res.charCodeAt(i)<Oxff){encodeRes+=res[i]}else{encodeRes+="\\u"+res.charCodeAt(i).toString(16);}}res=encodeRes}return res;
}
})(window);

JSON.parse()是将JSON对象转换为js对象

实现方式:(2种)

eval()

var json='{"a":"1","b":2}'var obj=eval("("+json+")");

直接调用eval,会产生xss漏洞。

利用new Function()

第一种eval的方法,相当于无脑把JSON字符串塞进去,eval和Function都有着动态编译js代码的作用

var func=new Function(arg1,arg2,...,functionBody)
var jsonStr='{"age":20,"name":"jack"}'
var json=(new Function('return'+jsonStr))()

 

转载于:https://www.cnblogs.com/yuan233/p/10986714.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部