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
}
这是主要的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
}