Java 从另一个JsonDeserializer调用自定义JsonDeserializer
我试图从另一个JsonDeserializer调用自定义JsonDeserializer,但我不知道如何调用 我正在实体中使用@JsonDeserialize注释: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 {
@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);