如何在javascript中去除json注释

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:我再次忘记将键名放在双引号中,更新了问题。

tar*_*rkh 6

虽然在 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)

这是演示


dea*_*ndi 3

让 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)