【问题标题】:Skipping bytes with the Jackson JsonParser使用 Jackson JsonParser 跳过字节
【发布时间】:2018-05-03 02:21:16
【问题描述】:

我目前有一个 FileInputStream,我知道它包含 json 格式的交错对象(Metadata.class 和 BigInfo.class),排序如下:

[元数据1,大信息1,元数据2,大信息2,元数据3,大信息3,...]

我正在使用 Jackson 的 JsonParser 来读取这些内容,例如 parser.readValueAs(Metadata.class) 和 parser.readValueAs(BigInfo.class)。

我想利用的一件事是 Metadata 对象包含以下序列化 BigInfo 对象的长度,以及我是否需要读取它。因此,如果不需要读取 BigInfo 对象,我希望能够跳过相应的字节数:

Metadata metadata = parser.readValueAs(Metadata.class);
// Whether I need to read the BigInfo object that comes after
boolean mustRead = metadata.isMustReadBigInfo();
if (!mustRead) {
    // Size of the bigInfo object that comes after
    int bigInfoSize = metadata.getBigInfoSize();
    parser.skip(bigInfoSize); // This 'skip' method is needed
}

我可以通过使用 parser.skipChildren() 来实现“跳过”,但这会顺序读取(并丢弃)inputStream 的所有字节,并且会比底层 FileInputStream 的 'skip' 方法慢得多,该方法使用随机访问“寻找”到文件中的某个位置。

我尝试在解析器的底层 inputStream 上调用“skip(bigInfoSize)”。但是,这不起作用,因为 JsonParser 从 inputStream 读取信息并将其存储在内部缓冲区中,因此 inputStream 的位置比解析器所在的位置更远。

任何有关如何解决此问题的想法将不胜感激。 谢谢!

【问题讨论】:

    标签: java jackson jackson-databind


    【解决方案1】:

    所以在环顾四周之后,我认为没有一个干净的方法可以用 jsonParser 来做到这一点。 我最终为通用 InputStream 实现了一个阅读器,它查找“{”和“}”(当然考虑到嵌套对象),并通过 ObjectMapper 从检索到的字节数组中解析出底层对象。

    【讨论】:

      【解决方案2】:

      你也许可以做这样的事情

      RandomAccessFile file = new RandomAccessFile(filename, "r");
      InputStream inputStream = Channels.newInputStream(file.getChannel());
      file.seek(byteLocationToSkipTo); //This allows you to set file pointer to this location
      JsonParser parser = new JsonFactory().createParser(inputStream);
      Map<String, Object> map = parser.readValueAs(Metadata.class);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多