【发布时间】:2014-01-03 11:38:31
【问题描述】:
我有一个 Java 应用程序,它使用 Spring 的 RestTemplate API 来编写简洁、可读的 JSON REST 服务使用者:
本质上:
RestTemplate rest = new RestTemplate(clientHttpRequestFactory);
ResponseEntity<ItemList> response = rest.exchange(url,
HttpMethod.GET,
requestEntity,
ItemList.class);
for(Item item : response.getBody().getItems()) {
handler.onItem(item);
}
JSON 响应包含一个项目列表,如您所见,我在自己的代码中有一个事件驱动的设计来依次处理每个项目。但是,整个列表作为response 的一部分存在于内存中,由RestTemplate.exchange() 生成。
我希望应用程序能够处理包含大量项目的响应 - 比如说 50,000 个,在这种情况下,目前的实现存在两个问题:
- 在传输整个 HTTP 响应之前不会处理单个项目 - 增加了不必要的延迟。
- 巨大的响应对象位于内存中,在处理完最后一项之前无法进行 GC。
是否有相当成熟的 Java JSON/REST 客户端 API 以事件驱动的方式使用响应?
我想它会让你做这样的事情:
RestStreamer rest = new RestStreamer(clientHttpRequestFactory);
// Tell the RestStreamer "when, while parsing a response, you encounter a JSON
// element matching JSONPath "$.items[*]" pass it to "handler" for processing.
rest.onJsonPath("$.items[*]").handle(handler);
// Tell the RestStreamer to make an HTTP request, parse it as a stream.
// We expect "handler" to get passed an object each time the parser encounters
// an item.
rest.execute(url, HttpMethod.GET, requestEntity);
我很感激我可以使用来自 Jackson、GSON 等的流式 JSON API 来实现我自己的这种行为实现——但我很想被告知有一些东西可以通过简洁、富有表现力的 API 可靠地完成它,与 HTTP 方面集成。
【问题讨论】:
-
这可能会有所帮助:stackoverflow.com/questions/444380/… 我倾向于先尝试 GSON。
-
我进行了相当多的谷歌搜索,但找不到提供JsonParser 或类似名称的现成 Spring HttpMessageConverter。没有将其发布为答案,因为您明确提到这不是您要寻找的,但我认为滚动您自己的可能是最好的方法。恕我直言,它将成为 Spring 的一个很好的补充。我对 Jersey 也相当熟悉,但找不到任何提供对 JSON 流的事件驱动访问的东西。