如何在Java中用分离的json对象解析文本文件?

如何在Java中用分离的json对象解析文本文件?,java,json,parsing,Java,Json,Parsing,我有一个文本文件,每15-16分钟更新一次,其中包含一些json数据。这些json数据之间用#####行分隔。该文件的代码段是: [{"accountId":"abc","items":[{"serviceName":"XYZ","dataCenter":"TG","startTimeUtc":"2017-04-05T19:57:33.509+0000","endTimeUtc":"2017-04-05T19:57:33.509+0000","usage":[{"resourceName":"X

我有一个文本文件,每15-16分钟更新一次,其中包含一些json数据。这些json数据之间用#####行分隔。该文件的代码段是:

[{"accountId":"abc","items":[{"serviceName":"XYZ","dataCenter":"TG","startTimeUtc":"2017-04-05T19:57:33.509+0000","endTimeUtc":"2017-04-05T19:57:33.509+0000","usage":[{"resourceName":"XYZ_EE_PAAS_GATEWAYS","quantity":7,"units":"number"}]}]},{"accountId":"XYZp1cm9mbe","items":[{"serviceName":"XYZ","dataCenter":"TG","startTimeUtc":"2017-04-05T19:57:33.509+0000","endTimeUtc":"2017-04-05T19:57:33.509+0000","usage":[{"resourceName":"XYZ_EE_PAAS_GATEWAYS","quantity":6,"units":"number"}]}]}]
######################
[{"accountId":"abc","items":[{"serviceName":"XYZ","dataCenter":"TG","startTimeUtc":"2017-04-05T19:59:33.523+0000","endTimeUtc":"2017-04-05T19:59:33.523+0000","usage":[{"resourceName":"XYZ_EE_PAAS_GATEWAYS","quantity":7,"units":"number"}]}]},{"accountId":"XYZp1cm9mbe","items":[{"serviceName":"XYZ","dataCenter":"TG","startTimeUtc":"2017-04-05T19:59:33.523+0000","endTimeUtc":"2017-04-05T19:59:33.523+0000","usage":[{"resourceName":"XYZ_EE_PAAS_GATEWAYS","quantity":6,"units":"number"}]}]}]
######################
[{"accountId":"abc","items":[{"serviceName":"XYZ","dataCenter":"TG","startTimeUtc":"2017-04-05T20:01:33.531+0000","endTimeUtc":"2017-04-05T20:01:33.531+0000","usage":[{"resourceName":"XYZ_EE_PAAS_GATEWAYS","quantity":7,"units":"number"}]}]},{"accountId":"XYZp1cm9mbe","items":[{"serviceName":"XYZ","dataCenter":"TG","startTimeUtc":"2017-04-05T20:01:33.531+0000","endTimeUtc":"2017-04-05T20:01:33.531+0000","usage":[{"resourceName":"XYZ_EE_PAAS_GATEWAYS","quantity":6,"units":"number"}]}]}]
######################
此文件每15-16分钟更新一次新条目。我想读取文件并在json对象中存储除#####行之外的最新条目。如何在java中实现它?我不想使用15分钟的时间间隔,因为它不是常数


我的简单要求是,在任何时候,我都会读取文件,并希望检索####行上方的最后一个json

使用Java 8,您可以这样做:

public JsonObject retrieveLastEntry(Path path) throws IOException {
  String[] jsonLines = Files.lines(path)
    .filter(line -> !line.equals("######################")
    .toArray();
  String lastJsonLine = jsonLines[jsonLines.length - 1];
  return MyFavoriteJsonParser.parse(lastJsonLine);
}
MyFavoriteJsonParser
引用您想要使用的任何JSON库(可能看一看)。这里可能没有多少性能方面的考虑。如果您的文件非常大(大大超过几MB),那么
.toArray()
调用可能不适合您。事实上,如果性能非常关键,您甚至可能需要考虑向后解析文件。但是性能优化的金科玉律是首先使用一个简单的解决方案,看看它是否(以及在哪里)性能不够

但是,如果您的JSON跨行,那么流API不是最佳选择。在这种情况下,一个常规的迭代将起到解救作用:

public JsonObject retrieveLastEntry(File file) throws IOException {
  String lastJson = "";
  StringBuffer sb = new StringBuffer();
  try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileReader(file), "UTF-8")))) {
    String line;
    while ((line = reader.readLine()) != null) {
      if (line.equals("######################") {
        lastJson = sb.toString(); sb.setLength(0);
      } else {
        sb.append(line).append('\n');
      }
   }
   return MyFavoriteJsonParser.parse(lastJsonLine);
}
基本思想是聚合
######…
之间的行,并在到达新分隔符时将它们放入变量中。您可能仍然想考虑根本没有条目的情况,并正确处理<代码> IOExtExo/代码>。
我认为这几乎就是惯用的方法。

两个问题:1:每次更新中是否只添加一行?第二:您的文件将增长多大?这些问题的答案将对您应该选择的解决方案产生重大影响:如果文件相对较小,则在每次更新时重新分析完整的文件可能不会带来很大的开销。如果每次更新只添加一行,则可以使用更新作为触发器,只分析最后一行。@mschenk74 1st:每次更新中是否只添加一行?根据具体情况,它可以是单行条目,也可以是多行格式的json条目。第二:您的文件将增长多大?该文件将有最多15个条目。鉴于您的这些额外信息,我想说,在您的情况下,没有必要进行优化。所以我会从下面塞巴斯蒂安·克鲁斯的答案开始。不要优化解决方案,除非它太慢。注意:在每次更新时解析完整文件时,您必须编写一些逻辑代码,以检测在以前的更新中已解析的行。谢谢您的回答。这很有帮助。我唯一关心的是,如果整个json不是一行,而是多行格式的json,该怎么办是唯一的分隔符并标记条目的结尾。这是一个很好的观点。你的例子并没有泄露,但我对此进行了更新。说到这里,进一步的考虑是:连续的分隔符,是否总是有一个终端分隔符?是的,我也更新了这个问题。每个条目后都会有分隔符。也就是说,文件现在是空的,添加了一个条目,因此,它看起来会像这样这样:这是这样的看起来看起来看起来会这样这样这样:这是第一个条目,这是第一个条目,这是第一个条目,这是第一个条目,这是第一个条目,这是第一个条目,这是第一个条目,这是第三个条目,这是第一个条目,这是第一个条目,这是第一个条目,这是第三个条目,是各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各各本摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩摩在评论中,我无法正确设置格式。上述解决方案应能正确处理此问题。