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 valueType)对List对象反序列化,方法使用错误导致报错。

    /**
     * 测试jackson,反序列化
     */
    @Test
    public void testJacksonDeserialize() throws Exception {
        List 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 valueTypeRef)方法进行反序列化。

    /**
     * 测试jackson,反序列化
     */
    @Test
    public void testJacksonDeserialize() throws Exception {
        List 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>(){}).readAll().get(0);
    }

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

你可能感兴趣的:(序列化,java)