Ami*_*sta 6 javascript regex json
如何在 javascript 中去除 json 注释?我认为正则表达式将是一种简洁的方式。
{
"filed": { // comments
"n": 1 /* multi-line ...
comments */
},
"field2": " // comments in string , /* here */ "
}
Run Code Online (Sandbox Code Playgroud)
应该在上面的例子上工作。
注意:字符串中的意见应不会被删除。
更新:我知道我的 json 注释无效,但为了简单起见,我想拥有它们然后删除它们,我看到很多工具都支持解析带有注释的 json。
更新 2:上面的例子本身是一个字符串,我没有解释(抱歉),现在看到一些答案认为它是一个 js 代码。
更新 3:我再次忘记将键名放在双引号中,更新了问题。
虽然在 JSON 中注释不是标准做法,但在某些情况下它可能很有用。为此,我为 nodejs 编写了小包:json-easy-strip
这是它的主要源代码:
数据
{
/*
* Sweet section
*/
"fruit": "Watermelon", // Yes, watermelons is sweet!
"dessert": /* Yummy! */ "Cheesecake",
// And finally
"drink": "Milkshake - /* strawberry */ or // chocolate!" // Mmm...
}
Run Code Online (Sandbox Code Playgroud)
单行解析器
data = data.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => g ? "" : m);
Run Code Online (Sandbox Code Playgroud)
结果
console.log(data);
// {
// fruit: 'Watermelon',
// dessert: 'Cheesecake',
// drink: 'Milkshake - /* strawberry */ or // chocolate!'
// }
Run Code Online (Sandbox Code Playgroud)
这是演示
让 javascript 解析器来做这件事:
a = {
filed: { // comments
n: 1 /* multi-line ...
comments */
},
field2: " // comments in string , /* here */ "
}
a.toSource()
/*
({filed:{n:1}, field2:" // comments in string , /* here */ "})
*/
Run Code Online (Sandbox Code Playgroud)
您可以使用字符串(根据编辑的问题)以同样的方式完成此操作:
a = 'a = {\r\n filed: { // comments n: 1 \r\n/* multi-line ... comments */\r\n},\r\n'
+ 'field2: " // comments in string , /* here */ "\r\n}'
eval(a).toSource().toString();
Run Code Online (Sandbox Code Playgroud)
但chrome好像不行?哦,忘了,抱歉,它只是 FF(在 Javascript 版本 3 中)。
我在https://gist.github.com/archan937/1961799找到了替代品,因此以下内容也适用于大多数其他浏览器。
function inspect(object) {
switch (typeof(object)) {
case "undefined":
return "undefined";
case "string":
return "\"" + object.replace(/\n/g, "\\n").replace(/\"/g, "\\\"") + "\"";
case "object":
if (object == null) {
return "null";
}
var a = [];
if (object instanceof Array) {
for (var i in object) {
a.push(inspect(object[i]));
};
return "[" + a.join(", ") + "]";
} else {
for (var key in object) {
if (object.hasOwnProperty(key)) {
a.push(key + ": " + inspect(object[key]));
}
};
return "{" + a.join(", ") + "}";
}
default:
return object.toString();
}
};
a = 'a = {\r\n filed: { // comments n: 1 \r\n/* multi-line ... comments */\r\n},\r\n'
+ 'field2: " // comments in string , /* here */ "\r\n}'
alert(inspect(eval(a)));
Run Code Online (Sandbox Code Playgroud)