Java 从另一个JsonDeserializer调用自定义JsonDeserializer

Java 从另一个JsonDeserializer调用自定义JsonDeserializer,java,spring,jackson,Java,Spring,Jackson,我试图从另一个JsonDeserializer调用自定义JsonDeserializer,但我不知道如何调用 我正在实体中使用@JsonDeserialize注释: @JsonDeserialize(using = BobDeserializer.class) class Bob { private Integer number; ... } @JsonDeserialize(using = AliceDeserializer.class) class Alice {

我试图从另一个JsonDeserializer调用自定义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调用BobDeserializer的帮助我想为此使用自动机制,而不是使用@Autowired注入反序列化程序


谢谢

一般来说,在编写自定义反序列化程序时,您需要确保您可以使用
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;
    }
}

我知道ObjectMapper,但我不知道如何在JsonNode中使用readValue。这就像调用toString一样简单。谢谢
@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);