加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 从Jackson JsonNode创建InputStream的最佳方法是什么?

发布时间:2020-12-15 02:16:50 所属栏目:Java 来源:网络整理
导读:我想找到一种最聪明的方法来创建 Java库Jackson的JsonNode的InputStream. 到现在为止我做了: IOUtils.toInputStream(jsonNode.toString()); 但是这种方式在创建InputStream之前将JsonNode转换为String. 不需要: org.apache.http.entity.InputStreamEntity
我想找到一种最聪明的方法来创建 Java库Jackson的JsonNode的InputStream.

到现在为止我做了:

IOUtils.toInputStream(jsonNode.toString());

但是这种方式在创建InputStream之前将JsonNode转换为String.

不需要:

org.apache.http.entity.InputStreamEntity entity = new InputStreamEntity(IOUtils.toInputStream(jsonNode.toString()));

解决方法

>在大多数情况下,如果使用ObjectMapper直接生成字节数组,JSON将写为UTF-8并且可以节省一些内存.

ObjectMapper objectMapper = new ObjectMapper();
JsonNode json = ...; 
byte[] bytes = objectMapper.writeValueAsBytes(json);

具体来说,Apache HTTP客户端提供ByteArrayEntity以用于字节数组.对于其他用途,有一个ByteArrayInputStream.

当然,ObjectMapper应该只创建一次并重用.
>如果您真的希望以流方式编写JSON,则可以使用一对PipedInputStream和PipedOutputStream,但是,如JavaDoc所述

Typically,data is read from a PipedInputStream object by one thread and data is written to the corresponding PipedOutputStream by some other thread. Attempting to use both objects from a single thread is not recommended,as it may deadlock the thread.

例:

ObjectMapper objectMapper = new ObjectMapper();
JsonNode json = ...; 

PipedInputStream in = new PipedInputStream();

new Thread(() -> {
    try {
        IOUtils.copy(in,System.out);
    } catch (IOException e) {
        ...
    }
}).start();

try (
    PipedOutputStream out = new PipedOutputStream(in);
    JsonGenerator gen = objectMapper.getFactory().createGenerator(out);
) {
    gen.writeTree(json);
} catch (IOException e) {
    ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读