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

时间:2016-09-23 12:23:19

标签: java jackson inputstream

我想找到一种最聪明的方法来创建一个InputStream来自Java库Jackson的JsonNode

直到现在我已经完成了:

IOUtils.toInputStream(jsonNode.toString());

但是这样可以在创建JsonNode之前将String转换为InputStream

不需要:

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

1 个答案:

答案 0 :(得分:0)

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