【问题标题】:Calling custom JsonDeserializer from another JsonDeserializer从另一个 JsonDeserializer 调用自定义 JsonDeserializer
【发布时间】:2015-07-13 22:12:33
【问题描述】:

我正在尝试从另一个调用自定义 JsonDeserializer,但我不知道如何。

我在我的实体中使用@JsonDeserialize 注释:

@JsonDeserialize(using = BobDeserializer.class)
class Bob {

    private Integer number;

    ...

}


@JsonDeserialize(using = AliceDeserializer.class)
class Alice {

    private Bob bob;

    ...

}

我的反序列化器是:

class BobDeserializer extends StdDeserializer<Bob> {

    public Bob deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        JsonNode node = parser.getCodec().readTree(parser);

        Integer number = node.get("number").asInt();

        Bob bob = new Bob();
        bob.setNumber(number);

        return bob;
    }

}


class AliceDeserializer extends StdDeserializer<Alice> {

    public Alice deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        JsonNode node = parser.getCodec().readTree(parser);

        Bob bob = ???????; // How to get Bob calling BobDeserializer to deserialize node.get("bob")?

        Alice alice = new Alice();
        alice.setBob(bob);

        return alice;
    }

}

AliceDeserializer 接收如下 JSON 输入:

{
    "bob": {
        "number": 2
    }
}

我需要从 AliceDeserializer 调用 BobDeserializer 的帮助。 我想为此使用自动机制,而不是使用@Autowired 注入反序列化器。

谢谢

【问题讨论】:

    标签: java spring jackson


    【解决方案1】:

    通常,在编写自定义反序列化器时,您需要确保可以使用ObjectMapper 序列化任何内容,而不是实际解析每个字段本身。一旦你这样做了,ObjectMapper 将自动调用对象的反序列化器(如果存在)。

    还有代码:

    @JsonDeserialize(using = BobDeserializer.class)
    class Bob {
    
        private Integer number;
    
        public Bob() {
        }
    
        public Integer getNumber() {
            return number;
        }
    
        public void setNumber(Integer number) {
            this.number = number;
        }
    }
    
    @JsonDeserialize(using = AliceDeserializer.class)
    public class Alice {
        private Bob bob;
    
        public Alice() {
        }
    
        public Bob getBob() {
            return bob;
        }
    
        public void setBob(Bob bob) {
            this.bob = bob;
        }
    }
    
    class BobDeserializer extends StdDeserializer<Bob> {
    
        protected BobDeserializer() {
            super(Bob.class);
        }
    
        public Bob deserialize(JsonParser parser, DeserializationContext context) throws IOException {
            JsonNode node = parser.getCodec().readTree(parser);
    
            Integer number = node.get("number").asInt();
    
            Bob bob = new Bob();
            bob.setNumber(number);
    
            return bob;
        }
    }
    
    class AliceDeserializer extends StdDeserializer<Alice> {
    
        protected AliceDeserializer() {
            super(Alice.class);
        }
    
        public Alice deserialize(JsonParser parser, DeserializationContext context) throws IOException {
            JsonNode node = parser.getCodec().readTree(parser);
    
            ObjectMapper mapper = new ObjectMapper();
            Bob bob = mapper.readValue(node.get("bob").toString(), Bob.class);
    
            Alice alice = new Alice();
            alice.setBob(bob);
    
            return alice;
        }
    }
    

    以及反序列化测试代码:

    Alice alice = new Alice();
    Bob bob = new Bob();
    bob.setNumber(3);
    alice.setBob(bob);
    
    ObjectMapper mapper = new ObjectMapper();
    
    Alice alice1 = mapper.readValue(mapper.writeValueAsString(alice), Alice.class);
    

    【讨论】:

    • 我知道 ObjectMapper,但我不知道如何将 readValue 与 JsonNode 一起使用。就像调用 toString 一样简单。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2020-09-08
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多