20

json2.js严格要求所有对象键都被双引号引起来。但是,在 Javascript 语法{"foo":"bar"}中等价于{foo:"bar"}.

我有一个 textarea 接受来自用户的 JSON 输入,并希望“放宽”对双引号键的限制。我已经了解了 json2.js 如何在对 JSON 字符串进行评估之前分四个阶段对其进行验证。我能够添加第 5 阶段以允许未引用的密钥,并且想知道此逻辑是否存在任何安全隐患。

var data = '{name:"hello", age:"23"}';

// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
     .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
     .replace(/(?:^|:|,)(?:\s*\[)+/g, ":") // EDITED: allow key:[array] by replacing with safe char ":"
     /** everything up to this point is json2.js **/

     /** this is the 5th stage where it accepts unquoted keys **/         
     .replace(/\w+\s*\:/g, ":")) ) { // EDITED: allow any alphanumeric key

  console.log( (new Function("return " + data))() );
}
else {
  throw( "Invalid JSON: " + data );
}
4

5 回答 5

7
data.replace(/(['"])?([a-zA-Z0-9]+)(['"])?:/g, '"$2":');

这将替换参数名称上的任何单引号,并添加任何缺少的。

于 2010-11-18T00:32:00.850 回答
2

我认为有实际的测试用例来消除这个实现的任何问题会很有帮助。我添加了一个名为 JSOL 的 github 项目并进行了一些测试。请填写免费添加到它并发现问题。谢谢。

https://github.com/daepark/JSOL

于 2010-11-18T22:18:29.973 回答
1

JSON 不允许不带引号的键。JSON 是 JavaScript 表示法的子集,不包括未加引号的键。将不带引号的键传递给几乎任何 JSON 解析器都可能会引发错误或返回“意外”结果。

希望这可以帮助

于 2010-11-18T00:21:20.553 回答
0

利用JSON5.parse

JSON5是 JSON 的超集,它允许 ES5 语法,包括不带引号的属性键。JSON5 参考实现(json5npm 包)提供了一个JSON5对象,该对象具有与内置JSON对象相同的方法和相同的参数和语义。

于 2020-05-04T19:26:27.377 回答
0

“带注释的 JSON”实际上是一个有效的 javascript,因此在 javascript 环境中,解析它的最简单的本地方法就是像这样评估它

function evalJs(js) {
    let fn = new Function("return (" + js + ")"),
        res = fn()
    return res;
}

let json5 = "{\n" +
    "//////\n" +
    "key: 5," +
    "}"

let data = evalJs(json5)
console.info(data)

输出是

{ key: 5 }
于 2020-12-16T03:48:18.763 回答