繁体   English   中英

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

[英]What's the best way to create an InputStream from a Jackson JsonNode?

我想找到一种最聪明的方法来创建Java库Jackson的JsonNodeInputStream

到现在为止我做了:

IOUtils.toInputStream(jsonNode.toString());

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

不需要:

org.apache.http.entity.InputStreamEntity entity = new InputStreamEntity(IOUtils.toInputStream(jsonNode.toString()));
  1. 在大多数情况下,如果使用ObjectMapper直接生成字节数组,JSON将写为UTF-8并且可以节省一些内存。

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

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

    当然,ObjectMapper应该只创建一次并重用。

  2. 如果您真的希望以流方式编写JSON,则可以使用一对PipedInputStream和PipedOutputStream,但是,如JavaDoc所述

    通常,一个线程从PipedInputStream对象读取数据,并且某些其他线程将数据写入相应的PipedOutputStream 建议不要尝试使用单个线程中的两个对象,因为它可能使线程死锁。

    例:

     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) { ... } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM