1

假设你有一个包含 C 风格注释的 json 文件

{
  "foo": {
    "default_level": "debug",
    // A comment
    "impl": "xyz"
  },
  "bar": [
    {
      /*This is a comment*/
      "format": "%l%d %c ….",
      "rotation": "daily, 1_000_000",
    }
  ]
}

在此之前 json 被反序列化,使用Java什么是最简单的方法来去除这些注释?让我们假设只支持单行//和多行/**/注释。

最终,我想阅读String同一个文件的表示,但没有评论:

{
  "foo": {
    "default_level": "debug",
    "impl": "xyz"
  },
  "bar": [
    {
      "format": "%l%d %c ….",
      "rotation": "daily, 1_000_000",
    }
  ]
}
4

3 回答 3

1

将其作为 Javascript 处理可能会更好,因为 JSON 几乎是 Javascript 的一个子集,而 JSON + C-like 注释实际上几乎是 Javascript 的一个子集。尝试:

希望从大量 javascript 文件中删除评论

基本上 - 只需先通过你最喜欢的缩小器运行它。请注意,JSON 不是 Javascript的严格子集,因此您需要将几乎合法的 JSON 塞入合法的 Javascript 中,然后才能信任 minifier。幸运的是,这可以通过简单的查找和替换来解决。

于 2013-06-27T19:17:13.893 回答
0

实际上是一个不平凡的问题。我个人建议 IMO 在这方面做得很好的 Comment-Stripper 库。在这里找到:https ://github.com/Slater-Victoroff/CommentStripper?source=cc

不久前,更完整的功能和调试版本被分叉,但希望这能解决这个问题。

全面披露:我在问了一个类似的问题并意识到我找不到任何好的解决方案后编写了这个库。

或者,如果您只想删除注释,我相信您可以在 Python 中轻松完成,您可以使用 Jython 调用它。

import json
return json.dumps(json.loads("file.json"))

如果您对 Native Java 死心塌地,您可以使用 GSON 来做基本相同的事情。( http://code.google.com/p/google-gson/ ),我认为杰克逊 ( http://jackson.codehaus.org/ ) 也可以,尽管我建议使用更轻的 GSON 来做这么简单的事情。

GSON 示例:

Gson gson = new Gson();
BufferedReader br = //BufferedReader for your source;
String clean = gson.toJson(gson.fromJson(br, Class.class))

示例给出的理解是需要附带一些支持代码,本示例仅封装了GSON的使用。其余的应该很简单(制作一个泛型类型类),如果您真的遇到问题,请查看 GSON 文档。

https://sites.google.com/site/gson/gson-user-guide

于 2013-06-27T18:43:43.460 回答
-4

试试这个正则表达式。

String jsonData =
"{\n"+
"  \"foo\": {\n"+
"    \"default_level\": \"debug\",\n"+
"    // A comment\n"+
"    \"impl\": \"xyz\"\n"+
"  },\n"+
"  \"bar\": [\n"+
"    {\n"+
"      /*This is a comment*/\n"+
"      \"format\": \"%l%d %c ….\",\n"+
"      /* This is a\n"+
"         multi-line comment */\n"+
"      \"rotation\": \"daily, 1_000_000\",\n"+
"    }\n"+
"  ]\n"+
"}";

System.out.println(
       jsonData.replaceAll("//.*\\n\\s*|/\\*.*?\\n?.*?\\*/\\n?\\s*", "")
);

输出:

{
  "foo": {
    "default_level": "debug",
    "impl": "xyz"
  },
  "bar": [
    {
      "format": "%l%d %c ….",
      "rotation": "daily, 1_000_000",
    }
  ]
}

注意:如果您的 json 可以将注释字符作为数据,这将不起作用

 "comment":"/* this is data */", "impl": "abc//xyz"
于 2013-06-27T18:39:03.843 回答