如何用Java 11 HttpClient直接获取jakarta.json.JsonObject响应
问题
我希望通过Jakarta JSONP API直接在HttpResponse中获取jakarta.json.JsonObject。目前只能先将响应获取为String,再传入阅读器解析,代码如下:
import java.net.http.HttpRequest; import java.net.http.HttpResponse; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonReader; HttpRequest request = HttpRequest.newBuilder().uri(uri).GET().build(); HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); JsonReader jsonReader = Json.createReader(new StringReader(response.body())); JsonObject object = jsonReader.readObject(); jsonReader.close();
请问如何直接得到HttpResponse<JsonObject> response?除Jakarta JSONP外,不想使用任何外部库。
补充说明:可通过自定义BodyHandler实现,示例框架如下:
import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodySubscriber; import java.net.http.HttpResponse.BodySubscribers; import java.net.http.HttpResponse.ResponseInfo; import jakarta.json.JsonObject; public class JsonObjectBodyHandler implements HttpResponse.BodyHandler<JsonObject> { @Override public BodySubscriber<JsonObject> apply(ResponseInfo responseInfo) { // 如何实现此方法 } }
调用方式:
HttpResponse<JsonObject> response = httpClient.send(request, new JsonObjectBodyHandler());
解决方案
可以通过BodySubscribers.mapping将响应输入流直接转换为JsonObject,同时利用try-with-resources语法自动关闭资源。完整实现代码如下:
import java.io.InputStream; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodySubscriber; import java.net.http.HttpResponse.BodySubscribers; import java.net.http.HttpResponse.ResponseInfo; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonReader; public class JsonObjectBodyHandler implements HttpResponse.BodyHandler<JsonObject> { @Override public BodySubscriber<JsonObject> apply(ResponseInfo responseInfo) { return BodySubscribers.mapping( BodySubscribers.ofInputStream(), inputStream -> { try (JsonReader jsonReader = Json.createReader(inputStream)) { return jsonReader.readObject(); } } ); } }
代码说明
BodySubscribers.ofInputStream():订阅响应体的输入流,作为转换的基础BodySubscribers.mapping():将输入流映射为目标类型JsonObject,完成直接解析- try-with-resources:自动关闭
JsonReader和底层输入流,避免资源泄漏
调用方式与你补充说明中的一致,之后可直接从响应中获取JsonObject:
HttpResponse<JsonObject> response = httpClient.send(request, new JsonObjectBodyHandler()); JsonObject jsonObject = response.body();
内容的提问来源于stack exchange,提问作者khateeb
相关产品推荐
相关产品推荐

