如何用js实现JSON.parse()

eval

1
2
var json = '{"a":"1", "b":2}';
var obj = eval("(" + json + ")"); // obj 就是 json 反序列化之后得到的对象

为什么要加括号呢? 因为js中{}通常是表示一个语句块,eval只会计算语句块内的值进行返回。加上括号就变成一个整体的表达式。

1
2
console.log( eval('{}') );      // undefind
console.log( eval('({})') ); // Object {}

eval作用域问题

1
2
3
4
5
6
7
var s = 1;
function a() {
eval('var s=2');
console.log(s);
}
a(); // 2
console.log(s); // 1
在局部环境使用eval便会创建局部变量。可以显示指定eval调用者来改变上下文环境。

1
2
3
4
5
6
7
var s = 'global';
function a() {
eval('var s = "local"');
console.log(s); // local
console.log(eval('s')); // local
console.log(window.eval('s')); // global
}

对参数json进行校验防止xss漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var rx_one = /^[\],:{}\s]*$/;
var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
var rx_four = /(?:^|:|,)(?:\s*\[)+/g;

if (
rx_one.test(
json
.replace(rx_two, "@")
.replace(rx_three, "]")
.replace(rx_four, "")
)
) {
var obj = eval("(" +json + ")");
}

递归手动扫描每个字符

new Function 函数声明的传参形式

1
2
var add = new Function('a, b', 'return a+b;');
console.log( add(2, 3) ); // 5
1
2
var jsonStr = '{ "age": 20, "name": "jack" }',
json = (new Function('return ' + jsonStr))();

插入script

模拟jsonP的方式拼接字符串然后以callBack的方式返回。

本文结束感谢您的阅读

本文标题:如何用js实现JSON.parse()

文章作者:陈宇(cosyer)

发布时间:2018年12月22日 - 23:12

最后更新:2020年07月21日 - 23:07

原始链接:http://mydearest.cn/%E5%A6%82%E4%BD%95%E7%94%A8js%E5%AE%9E%E7%8E%B0JSON.parse().html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!