com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从对象值 JsonToken.START_OBJECT

问题描述 投票:0回答:1

我正在尝试从 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 spring-boot jackson resttemplate
1个回答
0
投票

您的 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.