实现一个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))