Java Cannot deserialize instance of `xxx` out of START_ARRAY token问题2种情况解决(Java、Jackson)

目录

1 问题描述

2 问题分析

2.1 Java

2.2 Jackson


1 问题描述

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 100] (through reference chain: com.dto.UserDto["userId"])

2 问题分析

2.1 Java

1、后端接收参数类型是字符串,但是前端传参类型是数组,前端传参类型和后端参数类型不一致,导致报错。

解决办法:

前端传参类型改为字符串。

2、后端接收参数类型为List,但是前端传参类型为json,前端传参类型和后端参数类型不一致,导致报错。

解决办法:前端使用正确的数组传参格式即可。

[
    "344152905613578240"
]

2.2 Jackson

1、使用readValues(JsonParser p, Class<T> valueType)对List对象反序列化,方法使用错误导致报错。

    /**
     * 测试jackson,反序列化
     */
    @Test
    public void testJacksonDeserialize() throws Exception {
        List<Result> list = new ArrayList<>();
        list.add(Result.error(null, 1440931124753108994L));
        list.add(Result.error(null, new Date()));
        list.add(Result.error(null, LocalDate.now()));
        list.add(Result.error(null, LocalDateTime.now()));
        String listStr = objectMapper.writeValueAsString(list);
        list = objectMapper.readValues(objectMapper.getFactory().createParser(listStr), Result.class).readAll();
    }

解决办法:

应该使用readValues(JsonParser p, TypeReference<T> valueTypeRef)方法进行反序列化。

    /**
     * 测试jackson,反序列化
     */
    @Test
    public void testJacksonDeserialize() throws Exception {
        List<Result> list = new ArrayList<>();
        list.add(Result.error(null, 1440931124753108994L));
        list.add(Result.error(null, new Date()));
        list.add(Result.error(null, LocalDate.now()));
        list.add(Result.error(null, LocalDateTime.now()));
        String listStr = objectMapper.writeValueAsString(list);
        list = objectMapper.readValues(objectMapper.getFactory().createParser(listStr), new TypeReference<List<Result>>(){}).readAll().get(0);
    }

旭东怪的个人空间-旭东怪个人主页-哔哩哔哩视频哔哩哔哩旭东怪的个人空间,提供旭东怪分享的视频、音频、文章、动态、收藏等内容,关注旭东怪账号,第一时间了解UP注动态。人生低谷不可怕,可怕的是坚持不到人生转折点的那一天https://space.bilibili.com/484264966?spm_id_from=333.1007.0.0

"cannot deserialize instance of"这个错误信息通常出现在JSON解析过程中,指示无法将JSON字符串转换为特定对象的实例。具体的错误信息取决于上下文和具体的代码。 引用提供了一个例子,描述了一个JSON解析失败的问题。错误信息中指出无法将JSON的"START_OBJECT"令牌转换为"java.lang.String"类的实例。这通常是因为代码期望将JSON解析为String类型,但实际上却得到了一个对象。 引用也提供了一个类似的错误信息,指示无法解析一个数组对象为"com.xxx.SortPageButtonDto"类的实例。这可能是因为代码期望得到一个对象,但实际上得到了一个数组。 基于上述引用内容,"cannot deserialize instance of"错误通常发生在JSON解析过程中,当代码尝试将JSON转换为特定对象的实例时,遇到了不匹配的令牌类型。解决这个问题的方法取决于具体的代码和上下文。可能需要检查代码逻辑,确认期望的对象类型与实际的JSON结构是否匹配,并进行相应的调整和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JSON转换异常:Cannot deserialize instance of `java.lang.String` out of START_OBJECT token](https://blog.csdn.net/Mango_Bin/article/details/131021907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [全网详细解决Cannot deserialize instance of `com.xxx.实体类`out of START_ARRAY token at [Source: ...](https://blog.csdn.net/lvoelife/article/details/129304991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值