我正在尝试从 SpringBoot 调用外部 API,一旦我收到我试图保存在 dto 对象中的响应。
HistoricalApiResponse responseMap = restTemplate.getForObject(
url,
HistoricalApiResponse.class);
以下甲酸盐中的示例响应
{
"personsData": {
"2023-02-27": [
{
"country": "INDIA",
"age": 19,
"updated_at": "2022-06-24T00:00:11.483Z"
},
{
"country": "UK",
"age": 29,
"updated_at": "2022-06-24T00:00:11.483Z"
}
],
"2023-02-25": [
{
"country": "JPY",
"age": 39,
"updated_at": "2022-06-24T00:00:11.483Z"
},
{
"country": "CHINA",
"age": 39,
"updated_at": "2022-06-24T00:00:11.483Z"
}
]
}
}
我在下面的格式中编写了 HistoricalApiResponse 类。
public class HistoricalApiResponse {
HistoricalData[] historicalData;
}
class HistoricalData{
List<Person> personsData;
}
class Person{
Integer age;
String country;
Date upatedAt;
}
我得到以下异常 无法从对象值(令牌
[LHistoricalData;
)中反序列化JsonToken.START_OBJECT
类型的值;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从对象值(令牌[LHistoricalData;
)反序列化
JsonToken.START_OBJECT
类型的值
我尝试过将 HistoricalData 更改为列表、地图等方式。但得到其他一些例外。我找不到上述响应的 excat java 类。
你们能帮忙看看 JSON 的响应调用结构是什么吗?
您的 java 类与 json 模型不匹配。您需要一个“personData”对象,它看起来像一张地图,其中的键是 Date 对象,值是 List。这就是它对我有用的方式:
public class HistoricalApiResponse {
public Map<Date, List<Person>> personsData;
}
public class Person {
public Integer age;
public String country;
@JsonProperty("updated_at") // needed for mapping
public Date upatedAt;
}
以下是测试方法:
@Test
void test() throws JsonProcessingException {
String json = """
{
"personsData": {
"2023-02-27": [
{
"country": "INDIA",
"age": 19,
"updated_at": "2022-06-24T00:00:11.483Z"
},
{
"country": "UK",
"age": 29,
"updated_at": "2022-06-24T00:00:11.483Z"
}
],
"2023-02-25": [
{
"country": "JPY",
"age": 39,
"updated_at": "2022-06-24T00:00:11.483Z"
},
{
"country": "CHINA",
"age": 39,
"updated_at": "2022-06-24T00:00:11.483Z"
}
]
}
}
""";
var om = new ObjectMapper();
HistoricalApiResponse response = om.readValue(json, HistoricalApiResponse.class);
System.out.println(response);
}