Java - httpclient 使用 restful api。 Json api object 包含 Json 数组,无法使用 Jackson MismatchedInputException 进行解析

Java - httpclient consume restful api. Json api object contains Json arrays, can't parse with Jackson MismatchedInputException

这是主要的api https://wallhaven.cc/help/api我不确定标题解释是否正确,因为我才刚刚开始学习这些主题。

如果我尝试使用此 api https://wallhaven.cc/api/v1/w/pkgkkp 它会起作用,因为数据 object 仅包含一个 json 数组 object。

HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .GET()
                .uri(URI.create("https://wallhaven.cc/api/v1/w/pkgkkp"))
                .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());



        ObjectMapper mapper = new ObjectMapper();

        WallHaven post = mapper.readValue(response.body(), new TypeReference<WallHaven>() {
        });
        System.out.println(post);

但是,当我尝试消费这个 api https://wallhaven.cc/api/v1/search?q=anime%20girls 我得到 MismatchedInputException: Cannot deserialize value of type Data from Array value (token JsonToken.START_ARRAY)

因为它说 json 以 Array 开头。好吧,我会尝试做数组

WallHaven[] posts = mapper.readValue(response.body(), WallHaven[].class);
        System.out.println(posts);

我得到 MismatchedInputException:无法从 Object 值(标记 JsonToken.START_OBJECT

中反序列化 [LWallHaven; 类型的值

所以基本上问题是它要求 Object 或数组。但是,当我做相反的事情时,它总是要求另一个。

这是我的 WallHaven class

public class WallHaven {
public Data data;

public WallHaven(Data data) {
    this.data = data;
}


public WallHaven() {

}

@Override
public String toString() {
    return data.getPath();
}

}

数据包含所有其他 json objects/arrays 变量。我不知道如何解决这个问题。

您必须创建一个新的 class WallHavenArray class。 创建不同的映射器 class.One class 将不适用于两个 API,因为响应的结构不同

public class WallHavenArray {
public List<Data> data;

public WallHavenArray(List<Data> data) {
    this.data = data;
}


public WallHavenArray() {

}

@Override
public String toString() {
    return data; // Change this as well. Since now you have multiple Paths in single class
}