我想从Java字节数组中读取JSON“树”,并使用Jackson将回写的JSON“树”作为Java字节数组写出。一种显示方法如下所示:

ObjectMapper om = new ObjectMapper();
JsonNode old = om.createObjectNode();

byte[] arr = om.writeValueAsBytes(old);
JsonNode new = om.readTree(arr);

但是,由于配置中的线程安全性,而且由于可能仅与它们相关的优化, jackson 最近建议使用ObjectReader和ObjectWriter而不是ObjectMapper。但是,ObjectReader不直接支持带有字节数组的readTree,并且writeValueAsBytes比writeTree更通用,因此可能存在某种方式(也有理由)以某种方式跳过类型映射逻辑。

那么,今天,使用最新的Jackson(2.5),进行这两次转换的最快/最佳/推荐方式是什么?

最佳答案

直接使用ObjectMapper的问题是,如果更改映射器的配置,可能会导致问题。但是,如果您不更改基础配置,则无论如何都应该是安全的(更多信息请阅读here)。

但是,即使您确实更改了映射器的配置,但如果使用ObjectReaderObjectWriter,则完全安全。这是可能的,因为读取器/写入器是不可变的,因此无法更改基础状态。

因此,要读取/写入字节,以下方法可以正常工作:

ObjectMapper om = new ObjectMapper();
JsonNode oldNode = om.createObjectNode();

// Writing...
// Create an immutable writer (in this case using the default settings)
final ObjectWriter writer = om.writer();

// Use the writer for thread safe access.
final byte[] bytes = writer.writeValueAsBytes(oldNode);


// Reading...
// Create an immutable reader
final ObjectReader reader = om.reader();

// Use the reader for thread safe access
final JsonNode newNode = reader.readTree(new ByteArrayInputStream(bytes));

因此,基本上,您可以使用相同的原理(使用字节流),但是如果需要确保对映射器使用线程安全访问,则应该通过ObjectReaderObjectWriter访问读取/写入。

像这样in the JavaDoc描述writeValueAsBytes:



对于阅读,您可以简单地使用readTree(InputStream)版本。

10-07 16:14