目录
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);
}