[英]What's the best way to create an InputStream from a Jackson JsonNode?
我想找到一种最聪明的方法来创建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所述
通常,一个线程从
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.