在没有评估的情况下解析“放松”的JSON

时间:2012-03-09 16:26:30

标签: javascript json

解析“轻松”JSON但避免邪恶eval的最简单方法是什么?

以下引发错误:

JSON.parse("{muh: 2}");

因为正确的JSON应该引用密钥:{"muh": 2}


我的用例是一个简单的测试接口,用于将JSON命令写入节点服务器。到目前为止,我只使用eval,因为它只是一个测试应用程序。但是,在整个项目中使用JSHint总是让我对eval感到烦恼。所以我想要一个安全的选择,仍然允许放宽键的语法。

PS:我不想仅仅为了测试应用而自己编写解析器: - )

6 个答案:

答案 0 :(得分:21)

你已经知道了这一点,因为你referred me here = D,但我认为在这里记录它可能会很好:

我一直希望能够编写仍然有效的JS“轻松”JSON,所以我采用了Douglas Crockford的无eval json_parse.js并将其扩展为支持ES5功能:

https://github.com/aseemk/json5

此模块在npm上可用,可用作本机JSON.parse()方法的替代品。 (其stringify()输出常规JSON。)

希望这有帮助! =)

答案 1 :(得分:19)

您可以使用正则表达式替换来清理JSON:

var badJson = "{muh: 2}";
var correctJson = badJson.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ');
JSON.parse(correctJson);

答案 2 :(得分:9)

这是我最终要做的事情。我扩展了@ ArnaudWeil的答案,并添加了对:出现在值中的支持:

var badJSON = '{one : "1:1", two : { three: \'3:3\' }}';

var fixedJSON = badJSON

	// Replace ":" with "@colon@" if it's between double-quotes
	.replace(/:\s*"([^"]*)"/g, function(match, p1) {
		return ': "' + p1.replace(/:/g, '@colon@') + '"';
	})

	// Replace ":" with "@colon@" if it's between single-quotes
	.replace(/:\s*'([^']*)'/g, function(match, p1) {
		return ': "' + p1.replace(/:/g, '@colon@') + '"';
	})

	// Add double-quotes around any tokens before the remaining ":"
	.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?\s*:/g, '"$2": ')

	// Turn "@colon@" back into ":"
	.replace(/@colon@/g, ':')
;

console.log('Before: ' + badJSON);
console.log('After: ' + fixedJSON);
console.log(JSON.parse(fixedJSON));

它产生这个输出:

Before: {one : "1:1", two : { three: '3:3' }}
After: {"one":  "1:1", "two":  { "three":  "3:3" }}
{
  "one": "1:1",
  "two": {
    "three": "3:3"
  }
}

答案 3 :(得分:7)

如果在编写字符串时无法引用键,则可以在使用JSON.parse之前插入引号 -

var s= "{muh: 2,mah:3,moh:4}";
s= s.replace(/([a-z][^:]*)(?=\s*:)/g, '"$1"');

var o= JSON.parse(s);
/*  returned value:[object Object] */
JSON.stringify(o)
/*  returned value: (String){
    "muh":2, "mah":3, "moh":4
}

答案 4 :(得分:3)

JSON5看起来非常受欢迎,但这个relaxed-json库看起来也不错。

答案 5 :(得分:1)

你也可以使用NPM真正放松的json(https://www.npmjs.com/package/really-relaxed-json),它更进一步,不允许使用逗号,悬空逗号,注释,多行字符串等。

这是规范 http://www.relaxedjson.org

一些在线解析器:
http://www.relaxedjson.org/docs/converter.html

预装'坏json' {one : "1:1", two : { three: '3:3' }}

Bad JSON

预装甚至'更糟糕的json'(没有逗号) {one : '1:1' two : { three: '3:3' }} Worse JSON

预装了'可怕的json'(没有逗号,没有引号和逃脱的冒号) {one : 1\:1 two : {three : 3\:3}} Terrible JSON