turtle-rock
turtle-rock copied to clipboard
实现JSON.parse
个人觉得作者提供的方法不严谨,如果数据是如下格式将会报错
//通过逗号分隔将会报错
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: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。