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

Ple*_*mor 5 java inputstream jackson

我想找到最聪明的方法来InputStreamJsonNodeJava 库 Jackson 的a创建一个。

到目前为止,我已经完成了:

IOUtils.toInputStream(jsonNode.toString());
Run Code Online (Sandbox Code Playgroud)

但是,这种方式转换JsonNodeString创建之前InputStream

前需要:

org.apache.http.entity.InputStreamEntity entity = new InputStreamEntity(IOUtils.toInputStream(jsonNode.toString()));
Run Code Online (Sandbox Code Playgroud)

Kon*_*lin 2

  1. 在大多数情况下,JSON 被编写为 UTF-8,如果使用 ObjectMapper 直接生成字节数组,则可以节省一些内存。

    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode json = ...; 
    byte[] bytes = objectMapper.writeValueAsBytes(json);
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  2. 如果您确实希望以流式传输方式编写 JSON,则可以使用一对 P​​ipedInputStream 和 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) {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)