如何在javascript中删除json注释

时间:2015-11-02 17:43:08

标签: javascript json regex

如何在javascript中删除json注释? 我认为正则表达式将是一种简洁的方式。

{
    "filed": { // comments
         "n": 1 /* multi-line ...
                                 comments */
    },
    "field2": " // comments in string , /* here */ "
}

应该适用于上面的例子。
注意:字符串中的注释应删除。

更新:我知道评论i json无效,但为了简单起见我想拥有它们然后删除它们,我看到很多工具支持解析有评论的jsons。

更新2 :上面的示例本身就是一个字符串,我没有解释(抱歉),现在看到一些答案,认为它是一个js代码。

更新3 :我再次忘记将关键名称放在双引号中,更新了问题。

5 个答案:

答案 0 :(得分: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 */ "})
*/

你可以用一个字符串(根据编辑过的问题)以同样的方式做到:

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();

但它似乎与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)));

答案 1 :(得分:3)

一种简单的方法是运行JSON.stringify然后JSON.parse并保持清洁。

答案 2 :(得分:3)

虽然JSON中的注释不是标准做法,但在某些情况下可能很有用。为此,我为nodejs编写了一个小程序包:json-easy-strip

这是主要的源代码:

数据

["["2","0","2","0"]"]

单行解析器

@years = Task
           .where(id: params[:id])
           .map { |u| u.created_at.year}.to_s.split(//)

结果

{
    /*
     * Sweet section
     */
    "fruit": "Watermelon", // Yes, watermelons is sweet!
    "dessert": /* Yummy! */ "Cheesecake",
    // And finally
    "drink": "Milkshake - /* strawberry */ or // chocolate!" // Mmm...
}

这里是demo

答案 3 :(得分:1)

仅仅是个人观点,如果你想为生产目的保留一个无效的JSON评论,我想由你自己决定,但是将这些东西部署到你的网站,然后填充JavaScript hacks以使其工作并不是看起来不错。我建议您为部署生成一个干净的JSON文件,并将注释的代码保留给自己。最终用户不必看到它,并且他当然也不需要一堆缩进空间来增加传输的数据量。

无论如何,这是删除这些评论的一种方法:

var invalid_json = "{\n\"filed\": { // comments\n\"n\": 1 /* multi-line ...\ncomments */\n},\n\"field2\": \" // comments in string , /* here */ \"\n}";

eval("var x = " + invalid_json);
var x = JSON.stringify(x);
alert(x); // x should be valid JSON of that

另一种方法是将它用作JavaScript而不是JSON,你只需稍微修改一下文件:

// file.js
var data = {
    "filed": { // comments
         "n": 1 /* multi-line ...
                                 comments */
    },
    "field2": " // comments in string , /* here */ "
};

在页面中:

<script type="text/javascript" src="file.js"></script>

这应该将对象导入到您的页面,名称为data

答案 4 :(得分:1)

如果您需要删除评论,并支持JSON5,​​请查看库decomment

它可以用同样简单的方式从JSON5,​​JavaScript ES6,CSS和HTML中删除注释。

var decomment = require('decomment');

var code = "var t; // comments";

decomment(code); //=> var t;