弹簧启动中的"Cannot deserialize"错误



我是Spring Boot上的新程序员。我正在进行我的项目,在读取数据文件时遇到了一个错误。通常我的代码更长。不过,我为您准备了一个示例代码。

public static void main(String[] args) {
SpringApplication.run(BookApplication.class, args); 
String url="http://localhost:8080/books/list";
RestTemplate restTemplate = new RestTemplate();
String resp = restTemplate.getForObject(url, String.class);
JsonParser springParser = JsonParserFactory.getJsonParser();
Map<String, Object> map = ((org.springframework.boot.json.JsonParser) springParser).parseMap(resp);
String mapArray[] = new String[map.size()];
System.out.println("Items found: " + mapArray.length);
int i = 0;
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
i++;
}
}

以及我写入数据库的Json文件:

[
{
"name": "Harry Potter",
}
]

所以我有一个错误:

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.LinkedHashMap<java.lang.Object,java.lang.Object>` out of START_ARRAY token
at [Source: (String)"[{"name":"Harry Potter"}]"; line: 1, column: 1]

如何修复此错误?

正如@deadshot所指出的,响应不是String、Object的Map。更确切地说是地图列表。

您可以通过使用ParameterizedTypeReference完全删除解析逻辑(使用JsonParser(来缩短代码,如下所示:

String url="http://localhost:8080/books/list";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<List<Map<String,String>>> response = restTemplate.exchange(url, HttpMethod.GET, null,
new ParameterizedTypeReference<List<Map<String,String>>>() {
});
List<Map<String,String>> body = response.getBody();
Assert.assertEquals("Harry Potter",body.get(0).get("name"));

然而,如果你想走JsonParser的方式,

String url="http://localhost:8080/books/list";
RestTemplate restTemplate = new RestTemplate();
String resp = restTemplate.getForObject(url, String.class);

JsonParser springParser = JsonParserFactory.getJsonParser();
List<Object> list = ((org.springframework.boot.json.JsonParser) springParser).parseList(resp);
System.out.println("Items found: " + list.size());
for (Object book : list) {
Map<String,String> bookMap = (Map<String,String>) book;
bookMap.forEach((key,val) -> System.out.println(key + " = " + val));
}

相关内容

最新更新