如何使用 Java 11 HttpClient 获取 jakarta.json.JsonObject 响应?

问题描述 投票:0回答:1

我想使用 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());
java jakarta-jsonp
1个回答
0
投票

根据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();
© www.soinside.com 2019 - 2024. All rights reserved.