SpringBean的ObjectMapper报错
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of cn.wen233.User
(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value (‘ca2701f2-5191-4ae5-9f57-9b584f7a2690’)
使用通过@Autowired或者@Resource注入的Jackson提供的Bean ObjectMapper。
原因:
-
1、这个Bean自带实现了Root级别的几个反序列化器,通过set方法实现反序列化。(因此重新自定义某个类的反序列化器失效)
-
2、mapper的convertValue跟readValue都使用了反序列化器。
自定义反序列化器
static class NodeDeserializer extends JsonDeserializer<Node> {
@Override
public Node deserialize(JsonParser jsonParser, DeserializationContext
deserializationContext) throws IOException, JsonProcessingException {
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
String name = node.get("name").asText();
String key = node.get("key").asText();
String description = node.get("description").asText();
// null被解析成字符串的null
if (description.equals("null")) {
description = null;
}
return new Node(name, key,description, isStart, isEnd);
}
}
null值被当成null字符串被处理了。
// 定义
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addDeserializer(ActiveNode.class, new ActiveNodeDeserializer());
objectMapper.registerModule(simpleModule);
// 使用
Node startNode = mapper.readValue(curJsonNode.toString(), Node.class);