You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:32:22