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

标签 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);

但是,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));

所以,基本上您可以使用相同的原则(对于字节流),但是如果您需要确保您使用线程安全访问映射器,您应该通过 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 - 当前推荐的将 byte[] 转换为 JsonNode 并返回的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28273827/

相关文章:

java - 如何使用 Jackson 反序列化 Map<?, ?> ?

java - 在 json 反序列化时添加验证 jackson

java - {Spring boot + Hibernate + MySQL}无法获取数据库连接

android - Realm.IO - 可以使用 createOrUpdateAllFromJson 解析 JSON 数组吗?

javascript - 如何使用 jQuery 访问 json 文件中的这些键和值?

php - 如何在dialoglow(api.ai)中生成我的代理的api.ai url并在PHP中使用该api URL将用户的输入存储在MYSQL数据库中

java - 如何在 Java 中复制对象内的二维数组?

java - SpringBoot无法基于JSON创建类的实例

java - libgdx 中的碰撞处理程序检测得太早

java - Jackson 无法解析 ISO8601