目前推荐的将byte []转换为JsonNode并返回的方法

时间:2015-02-02 08:42:58

标签: java json jackson

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

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

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

然而,杰克逊这些天建议使用ObjectReader和ObjectWriter而不是ObjectMapper,因为配置中的线程安全,但也因为可能仅与它们相关的优化。但是,ObjectReader不直接支持带字节数组的readTree,而writeValueAsBytes比writeTree更通用,因此可能有某种方式(以及原因)以某种方式跳过类型映射逻辑。

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

1 个答案:

答案 0 :(得分:6)

直接使用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));

所以,基本上你可以使用相同的原则(使用字节流),但如果你需要确保使用线程安全访问mapper,你应该通过ObjectReader访问读/写。 ObjectWriter

writeValueAsBytes的描述与此in the JavaDoc

相同
  

在功能上等同于使用writeValue(Writer,Object)调用java.io.ByteArrayOutputStream并获取字节,但效率更高。

对于阅读,您只需使用readTree(InputStream)版本。