从另一个JsonDeserializer调用自定义JsonDeserializer [英] Calling custom JsonDeserializer from another JsonDeserializer

查看:3608
本文介绍了从另一个JsonDeserializer调用自定义JsonDeserializer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从另一个调用自定义JsonDeserializer,但我无法弄清楚如何。

I'm trying to invoke a custom JsonDeserializer from another one, but I can't figure out how.

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

I'm using @JsonDeserialize annotations in my entities:

@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的JSON输入以下:

AliceDeserializer receives a JSON input like the following:

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

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

I need help invoking BobDeserializer from AliceDeserializer. I want to use an automatic mechanism for this, instead of injecting the deserializer using @Autowired.

谢谢

推荐答案

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

In general, when writing a custom deserializer you need to make sure anything you can serialize with the ObjectMapper instead of actually parsing every field by itself. Once you do that, the ObjectMapper will automatically call the deserializer of an object if exists.

代码:

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

这篇关于从另一个JsonDeserializer调用自定义JsonDeserializer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆