使用SpringBean的ObjectMapper报错

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);

猜你喜欢

转载自blog.csdn.net/qq_43621091/article/details/107070782