我想找到从 Java 库 Jackson 的 InputStream 中创建 JsonNode 的最聪明的方法。

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

IOUtils.toInputStream(jsonNode.toString());

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

前需要:
org.apache.http.entity.InputStreamEntity entity = new InputStreamEntity(IOUtils.toInputStream(jsonNode.toString()));

最佳答案

  • 在大多数情况下,JSON 被编写为 UTF-8,如果您直接使用 ObjectMapper 生成字节数组,则可以节省一些内存。
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode json = ...;
    byte[] bytes = objectMapper.writeValueAsBytes(json);
    

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

    当然,ObjectMapper 应该只创建一次并重复使用。
  • 如果您真的希望以流式方式编写 JSON,则可以使用一对 P​​ipedInputStream 和 PipedOutputStream,但是,正如 JavaDoc 所述



    例子:
    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) {
        ...
    }
    
  • 关于java - 从 Jackson JsonNode 创建 InputStream 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39660690/

    10-11 22:29
    查看更多