我想从java字节数组中读取一个JSON"树",并使用Jackson将JSON"树"作为java字节数组写回.一种方法如下所示:
ObjectMapper om = new ObjectMapper();
JsonNode old = om.createObjectNode();
byte[] arr = om.writeValueAsBytes(old);
JsonNode new = om.readTree(arr);
Run Code Online (Sandbox Code Playgroud)
但是,杰克逊最近建议使用ObjectReader和ObjectWriter而不是ObjectMapper,因为配置中的线程安全,但也因为可能只与它们相关的优化.但是,ObjectReader不支持直接使用字节数组的readTree,而writeValueAsBytes比writeTree更通用,因此可能有某种方式(和理由)以某种方式跳过类型映射逻辑.
那么,今天,使用最新的Jackson(2.5),进行这两次转换的最快/最佳/推荐方式是什么?
ObjectMapper直接使用的问题是,如果更改映射器的配置,则可能导致问题.但是,如果你不改变底层配置,你应该是安全的(更多阅读在这里).
但是如果你使用它ObjectReader并且ObjectWriter你完全安全,即使你确实改变了映射器的配置.这是可能的,因为读/写器是不可变的,因此不可能改变基础状态.
因此,要读取/写入字节,以下方法可以正常工作:
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));
Run Code Online (Sandbox Code Playgroud)
所以,基本上你可以使用相同的原则(使用字节流),但如果你需要确保使用线程安全访问映射器,你应该通过ObjectReader和访问读/写ObjectWriter.
的writeValueAsBytes是这样的描述在JavaDoc:
在功能上等同于调用
writeValue(Writer,Object)与java.io.ByteArrayOutputStream和获取字节,但更有效.
对于阅读,您可以简单地使用该readTree(InputStream)版本.