2015-11-02 49 views
3

如何去除javascript中的json评论? 我认为正则表达式将是一个简洁的方式。如何在JavaScript中去除json评论

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

应该对上面的例子有效。
注意:字符串中的注释应该是而不是被删除。

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

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

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

+6

为什么你在json中有评论?那个json是无效的... – taxicala

+0

更新了问题@taxicala –

+0

如果你想要去正则表达式路由,'(\/\ * [\ S \ s] *?\ * \ /)|(\/\/[^ \ n] *)'可能会工作:https://regex101.com/r/fJ1aC6/1 – lintmouse

回答

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

但它似乎没有与铬合作?哦,忘了,它只是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))); 
+0

不适用于Chrome: –

+0

问题更新 –

3

一个简单的方法是运行JSON.stringify然后JSON.parse瞧它的清洁。

+0

问题更新 –

+0

如果您的JSON更像JavaScript或JSON5,​​那么它不起作用,即使用开放式属性的JSON或正则表达式值。 –

0

只是个人观点,如果你想保留一个无效的JSON充满评论的生产目的,我想它取决于你,但部署这些东西到你的实时网站,然后用JavaScript黑客填充它,使其工作看起来不太好。我建议你生成一个干净的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

1

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

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

var decomment = require('decomment'); 

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

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