使用SpringBean的ObjectMapper报错

    技术2022-07-11  77

    文章目录

    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);
    Processed: 0.011, SQL: 9