当前推荐的将 byte[] 转换为 JsonNode 并返回的方法
Current recommended way to convert byte[] to JsonNode and back
我想从 java 字节数组中读取 JSON "tree" 并写入 JSON "tree" 作为 java 使用 Jackson 的字节数组。一种方法如下所示:
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),fastest/best/recommended 进行这两个转换的方法是什么?
直接使用 ObjectMapper
的问题是,如果您更改映射器的配置,可能会导致问题。但是,如果您不更改底层配置,无论如何您应该是安全的(更多阅读 here)。
但是如果你使用 ObjectReader
和 ObjectWriter
你是完全安全的,即使你真的改变了映射器的配置。这是可能的,因为 reader/writer 是不可变的,因此不可能更改基础状态。
因此,对于 read/write 字节,以下方法工作正常:
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));
所以,基本上你可以使用相同的原则(与字节流),但如果你需要确保你正在使用线程安全访问映射器,你应该通过 ObjectReader
和 ObjectWriter
.
writeValueAsBytes
是这样描述的in the JavaDoc:
Functionally equivalent to calling writeValue(Writer,Object)
with java.io.ByteArrayOutputStream
and getting bytes, but more efficient.
对于阅读,您可以简单地使用 readTree(InputStream)
版本。
我想从 java 字节数组中读取 JSON "tree" 并写入 JSON "tree" 作为 java 使用 Jackson 的字节数组。一种方法如下所示:
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),fastest/best/recommended 进行这两个转换的方法是什么?
直接使用 ObjectMapper
的问题是,如果您更改映射器的配置,可能会导致问题。但是,如果您不更改底层配置,无论如何您应该是安全的(更多阅读 here)。
但是如果你使用 ObjectReader
和 ObjectWriter
你是完全安全的,即使你真的改变了映射器的配置。这是可能的,因为 reader/writer 是不可变的,因此不可能更改基础状态。
因此,对于 read/write 字节,以下方法工作正常:
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));
所以,基本上你可以使用相同的原则(与字节流),但如果你需要确保你正在使用线程安全访问映射器,你应该通过 ObjectReader
和 ObjectWriter
.
writeValueAsBytes
是这样描述的in the JavaDoc:
Functionally equivalent to calling
writeValue(Writer,Object)
withjava.io.ByteArrayOutputStream
and getting bytes, but more efficient.
对于阅读,您可以简单地使用 readTree(InputStream)
版本。