【问题标题】:Using regex to parse a very simple JSON file使用正则表达式解析一个非常简单的 JSON 文件
【发布时间】:2013-12-30 22:21:42
【问题描述】:

我不确定是否可以完成,但我想将一个非常简单的 JSON 文件解析为字符串数组。

示例文件:

["String1", "String2", "oneMoreString"]

到目前为止,我认为我会使用带有模式的 Scanner 来获取我的输出,但没有做到这一点。

    ArrayList<String> strings = new ArrayList<String>();
    File f = new File("src/sample.txt");
    String pattern = "\\s*[\"\"]\\s*";
    try {
        InputStream is = new FileInputStream(f);
        Scanner s = new Scanner(is);
        s.useDelimiter(pattern);
        while (s.hasNext()){
            strings.add(s.next());
        }
        s.close();
        is.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

因为该模式显然是错误的,因为它认为“,”是合适的,但我希望它不会被包括在内...:S

我也接受可能适用于任何其他解析方式的建议。也许是 JSON 解析器?但因为文件太简单,我认为没有必要。

【问题讨论】:

  • 你可以看看 GSON parser code.google.com/p/google-gson
  • 进入了我的路径jackson.codehaus.org,但使用 JSON 解析器似乎有点矫枉过正......
  • @Daren,不,一点也不矫枉过正(使用 Jackson/Gson)。引入 10 多行正则表达式代码来处理简单的 JSON 字符串并不是可行的方法 (IMO)。
  • 好的,json 格式,谢谢你的意见。

标签: java regex json


【解决方案1】:

最好使用像 Jackson Mapper 这样的 JSON 解析器来解析 JSON 字符串。

但是如果你有一个简单的字符串,你可以快速使用一个示例正则表达式。

试试这个:

    String str = "[\"String1\", \"String2\", \"oneMoreString\"]";

    Pattern pattern = Pattern.compile("\"(.+?)\"");
    Matcher matcher = pattern.matcher(str);

    List<String> list = new ArrayList<String>();
    while (matcher.find()) {
        // System.out.println(matcher.group(1));.
        list.add(matcher.group(1));
    }

【讨论】:

  • matcher 只接受字符串,不接受输入流...你可以用扫描仪试试吗?对我来说,这似乎不起作用.. thnx!
  • 您可以使用 FileInputStream 从流中读取数据,然后将其传递给匹配器。
  • 在你建议之前就做了,它有效。谢谢。
  • 如果任何字符串包含转义的引号字符,这将失败。
【解决方案2】:

看到您的类路径中有 Jackson,只需执行以下操作:

ObjectMapper mapper = new ObjectMapper();
String[] array = mapper.readValue("[\"String1\", \"String2\", \"oneMoreString\"]", String[].class);
System.out.println(Arrays.toString(array));

将打印:

[String1, String2, oneMoreString]

【讨论】:

  • 我会接受他的解决方案(因为问题有正则表达式)但使用你的,谢谢。得到了我的支持。
【解决方案3】:
//split by ,
String strings[] = s.split(",");
//remove [ from first string
strings[0] = strings[0].substring(1);
//remove ] from last string
String last = strings[strings.length - 1];
strings[strings.length - 1] = last.substring(0, last.length() - 1);

【讨论】:

  • @Daren 好吧,你想避免使用 json 解析器 :)
  • s.substring(1,s.length()-1 (maybe 2?)).split(",") 会更容易
  • 如果任何 JSON 字符串包含逗号将不起作用。
  • @PhilKeeling 是的,但从他的问题看来它不会
  • 我正要说菲尔 - 它也不会删除每个字符串周围的引号
【解决方案4】:

您可以使用任何可用的 Java json 解析器,而不是像上面那样解析它

【讨论】:

  • 我知道,除了我不太了解 reg-exp 之外,还有什么理由这样做?在我看来像是矫枉过正。
  • 以这种方式考虑,您正在解析必须遵循一些规则的 JSON(JavaScript 对象表示法),例如被 { } 包围的键值对等。通常像 GSON 或 Jackson 之类的库(提到上面)在这方面提供一些验证,避免格式错误的 json 输入,并且通常(我都使用过)它们在性能上做得很好;如果您需要,还可以使用 json lib 为您提供其他功能以供将来扩展。如果您担心性能,您总是可以通过编写两种方法对其进行基准测试并测量运行所需的时间,差异会很小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 2013-10-22
  • 2011-04-11
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多