turtle-rock icon indicating copy to clipboard operation
turtle-rock copied to clipboard

实现JSON.parse

Open Davidyanlong opened this issue 5 years ago • 0 comments

个人觉得作者提供的方法不严谨,如果数据是如下格式将会报错

      //通过逗号分隔将会报错
    var data = JSON.stringify({"a":"1,1",b:2})

我自己也考虑了一下实现,当然也不是特别严谨,但是杜绝了上门的问题

  function parseJSON(txt) {

    let delFun = (newObj, items) => {
        Object.keys(items).forEach(key => {
            if (typeof items[key] !== "function") {
                if (typeof items[key] !== "object") {
                    newObj[key] = items[key];
                } else {
                    delFun(newObj[key], items[keys])
                }
            }
        })
    }

    if (
        (txt.charAt(0) == "{" && txt.charAt(txt.length - 1)) == "}" ||
        txt.charAt(0) == "[" && txt.charAt(txt.length - 1) == "]"
    ) {
        let result = eval(`(()=>(${txt}))()`);

        if (Array.isArray(result)) {
            let arrRes = [];
            result.forEach(item => {
                let obj = {};
                delFun(obj, item)
                arrRes.push(obj);
            })
            return arrRes;
        } else {
            let obj = {};
            delFun(obj, result);
            return obj;
        }


    } else {
        throw (new SyntaxError('语法错误'))
    }

}

测试发现JSON.parse方法的其他情况返回结果

   JSON.parse(123)  //输出结果是123
   JSON.parse(true)  //输出结果是true
   JSON.parse("abc")  // 返回错误
   JSON.parse(/test/)  //返回错误
   JSON.parse(()=>{}) //返回错误
 

JSON.parse 的语法完整参数是:

JSON.parse(text[, reviver]) * text:必需, 一个有效的 JSON 字符串。 * reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

Davidyanlong avatar Oct 13 '19 16:10 Davidyanlong