【问题标题】:Jackson JSON to stream parser杰克逊 JSON 流解析器
【发布时间】:2021-11-01 21:19:03
【问题描述】:

我想将来自 HttpRequest(JSON 对象)的响应作为流处理。这意味着仅过滤我感兴趣的 data 字段并将其作为流返回并进一步处理(作为 HttpServletResponse 发送)。我不想将它加载到内存中,因为 response.body() 可能很大(1 000 000 多行)。不幸的是,我在 JsonParser 类上没有看到任何会返回流的方法。

HttpResponse<InputStream> response = client.send(httpRequest, BodyHandlers.ofInputStream());
InputStream result = response.body();
JsonFactory factory = new JsonFactory();
try(JsonParser parser = factory.createParser(result)){
  while (parser.nextToken() != JsonToken.END_OBJECT) {
    if ("data".equals(parser.getCurrentName())) {
      parser.getValueAsString(); // it returns correct lines but as String
    }
  }
}

有人知道怎么处理吗?或者我应该使用其他一些库/API?

【问题讨论】:

  • cassiomolin.com/2019/08/19/… 可能是什么东西?
  • @Sam 我看到了。在此示例中,它展示了如何使用 ObjectMapper 或通过创建新对象的实例将 Json 对象解析为某个 Java 对象。我的目标是不将此数据加载到内存(不创建对象),而是将其作为流读取并进一步发送

标签: java json jackson stream


【解决方案1】:

您已经将输入数据作为流处理,因此可以轻松将其写入另一个流,例如HttpServletResponse

获取要将数据传输到的输出流:

ServletOutputStream out = httpServletResponse.getOutputStream();

并且对于每个数据字符串,将值写入新流:

while ... {
    if ("data".equals(parser.getCurrentName())) {
        String data = parser.getValueAsString();
        out.write(data.getBytes("UTF-8"));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2019-07-27
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多