java byte json_关于java:当前推荐的将byte []转换为JsonNode并返回的方法

博客讨论了在Jackson库中如何高效且线程安全地使用ObjectMapper、ObjectReader和ObjectWriter进行JSON字节数组的读写操作。建议使用ObjectReader和ObjectWriter以确保线程安全,并提供了示例代码展示如何实现这一过程。同时,文章提到了writeValueAsBytes和readTree方法的使用场景,并指出直接使用ByteArrayInputStream可能与使用byte[]的效率相当。
部署运行你感兴趣的模型镜像

我想从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),这两次转换的最快/最佳/推荐方式是什么?

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

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

writeValueAsBytes在JavaDoc中描述如下:

Functionally equivalent to calling writeValue(Writer,Object) with java.io.ByteArrayOutputStream and getting bytes, but more efficient.

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

您能否证明使用ByteArrayInputStream与使用byte []的readTree一样高效? 对于它们来说,JsonFactory.createParser(byte [])必须和JsonFactory.createParser(InputStream)一样有效,我怀疑它是 - 但我可能错了。

@Nakedible,我可以很容易地说我永远不会在这样的问题上作证;)但是,我做了一些简单的性能基准测试,我比较了不同的方法,输出可以在这里找到。

好吧,你确信我,即使微基准测试总是谎言;)谢谢,很好的答案!

您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值