从其他合法的json中删除类似C的评论

时间:2013-06-27 18:30:47

标签: java json parsing

假设您有一个包含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",
    }
  ]
}

3 个答案:

答案 0 :(得分:1)

可能更好的运气处理这个Javascript,因为JSON几乎是Javascript的一个子集,而JSON + C类的注释实际上几乎是Javascript的一个子集。尝试:

Looking to remove comments from a large amount of javascript files

基本上 - 首先通过你喜欢的minifier运行它。请注意JSON is not a strict subset of Javascript,因此您需要先将合法的JSON插入合法的Javascript中,然后才能信任缩小器。幸运的是,这可以通过简单的查找和替换来解决。

答案 1 :(得分:0)

实际上是一个非平凡的问题。我个人建议使用Comment-Stripper库,IMO可以很好地完成这项工作。在此处找到: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

答案 2 :(得分:-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"