实现一个JSON.parse()的几种方法:
# eval
它会执行JS代码,有XSS漏洞。他执行的代码拥有着执行者的权利 触发条件:参数 json 并非真正的 JSON 数据,而是可执行的 JS 代码。
function jsonParse(opt) {
return eval(`(${opt})`)
}
# Function
eval 与 Function 都有着动态编译js代码的作用,但是在实际的编程中并不推荐使用。
function jsonParse2(opt) {
return (new Function('return' + opt))()
}
# 正则表达式
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;
function jsonParse3(opt) {
if (
rx_one.test(
opt
.replace(rx_two, "@")
.replace(rx_three, "]")
.replace(rx_four, "")
)
) {
var obj = eval("(" + opt + ")");
}
return obj
}
测试:
let d = '{"arr":[1,2,{"x":5}],' +
'"obj":{"arr":[3,4,5],"string":"str2r","arr2":[6,"7","false",false,"undefined",{}]},' +
'"fun":"function(){console.log(2)}"}'
console.log(jsonParse(d))
console.log(jsonParse3(d))
let a = "function(){}"
let b = "undefined"
let c = '{"x":5}'
console.log(jsonParse(a))
console.log(jsonParse(b))
console.log(jsonParse(c))
console.log(jsonParse2(a))
console.log(jsonParse2(b))
console.log(jsonParse2(c))