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);
添加回答
舉報