我想使用 Jakarta JSONP API 在 HttpResponse 本身中获取 jakarta.json.JsonObject。现在,我必须将其作为字符串获取,将正文输入读取器,然后获取 JsonObject,如下面的代码所示。
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) {
// How to implement this
}
}
然后在函数中使用它,如下所示:
HttpResponse<JsonObject> response = httpClient.send(request, new JsonObjectBodyHandler());
根据f1sh评论的问题,您可以简单地使用JSON-P API更改Jackson部分:
import jakarta.json.Json;
import jakarta.json.JsonObject;
import java.io.StringReader;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class JsonBodyHandle implements HttpResponse.BodyHandler<JsonObject> {
@Override
public HttpResponse.BodySubscriber<JsonObject> apply(HttpResponse.ResponseInfo ri) {
HttpResponse.BodySubscriber<String> upstream = HttpResponse.BodySubscribers.ofString(StandardCharsets.UTF_8);
return HttpResponse.BodySubscribers.mapping(
upstream, body -> Json.createReader(new StringReader(body)).readObject());
}
}
然后你使用
JsonBodyHandle
:
HttpResponse<JsonObject> res = client.send(request, new JsonBodyHandle());
JsonObject json = res.body();