4 回答
TA贡献1829条经验 获得超7个赞
您拥有的链接的响应不是User,而是List<User>- 尝试反序列化。
您的代码应该与此类似(我试图稍微美化一下):
public List<User> exposeServices() {
RestTemplate restTemplate= new RestTemplate();
ResponseEntity<String> response= restTemplate.getForEntity("https://jsonplaceholder.typicode.com/posts", String.class);
Gson gson = new Gson();
return gson.fromJson(response.getBody(), List.class);
}
另外,如果您没有特定的使用理由Gson,我认为您可以这样做:
public List<User> exposeServices() {
RestTemplate restTemplate= new RestTemplate();
return restTemplate.getForEntity("https://jsonplaceholder.typicode.com/posts", List.class).getBody();
}
如评论中所述,这对演员表有警告。
TA贡献1860条经验 获得超8个赞
Jackson 是一个 JSON 序列化器/反序列化器,默认包含在 spring 中并被RestTemplate默认使用。
端点返回的是用户列表,因此您不能将其User直接反序列化为 a,它必须是 a 类型List<User>。
public List<User> exposeServices() {
RestTemplate restTemplate= new RestTemplate();
return restTemplate.exchange("https://jsonplaceholder.typicode.com/posts",
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<User>>() {})
.getBody();
}
如果你只是传入List.class它RestTemplate,它将不知道你希望你的列表包含什么,你可能会从编译器那里得到一个警告。
我们可以通过将 our 包装List<User>到一个ParameterizedTypeReference用于此的类型中来绕过它,用于向类型添加参数(列表是一种类型,它需要一个参数,在本例中为用户)。
TA贡献1852条经验 获得超1个赞
您可以为此使用以下解决方案
首先,您需要三个库“Jackson-Databind”、“jackson-annotations”、“jackson-core”,它们应该是同一版本。以下是示例代码
String jsonString = "<The json user list you received>";
ObjectMapper mapper = new ObjectMapper();
List user = mapper.readValue(jsonString.getBytes(), List.class);
Iterator it = user.iterator();
List<User> userList = new ArrayList<>();
while(it.hasNext())
{
User receivedUser = new User();
LinkedHashMap receivedMap = (LinkedHashMap)it.next();
receivedUser.setUserId((Integer)receivedMap.get("userId"));
receivedUser.setId((Integer)receivedMap.get("id"));
receivedUser.setTitle((String)receivedMap.get("title"));
receivedUser.setBody((String)receivedMap.get("body"));
userList.add(receivedUser);
}
我已经创建了用户类。最后 userList 将包含所有来的用户。
TA贡献1836条经验 获得超13个赞
您的解决方案是使用数组而不是一个对象:
User[] users = gson.fromJson(response, User[].class);
添加回答
举报