【问题标题】:Java Jackson : Can I hold in a json the type to deserialize it to?Java Jackson:我可以在 json 中保存将其反序列化为的类型吗?
【发布时间】:2015-09-19 02:12:51
【问题描述】:

序列化到json并返回的常用方法是:

String catStr = mapper.writeValueAsString(cat);
Cat catOut = mapper.readValue(catStr, Cat.class);

有没有办法在序列化时将类型添加(可能带有注释)到 json 中,并让映射器在反序列化时从中获取值?

所以我可以做以下事情

Object obj = mapper.readValue(catStr);

后来……

Cat catOut = (Cat)obj; 

谢谢。

【问题讨论】:

标签: java jackson java-8


【解决方案1】:

有点。您可以向序列化添加一个属性,该属性将指示它是什么类。然后在反序列化时,Jackson 会自动推断出类。

但是你不能将它反序列化为对象,你需要一些基类/接口来处理你想要表现得像这样的所有对象。并且那个接口需要使用@JsonTypeInfo注解,在反序列化这个基类时向Jackson发出信号,使用属性类来区分是哪种类型。

例子:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY)
private abstract class Base {

}

private class A extends Base {
    private final int i;

    @JsonCreator
    public A(@JsonProperty("i") int i) {
        this.i = i;
    }
}

序列化的时候会是:

{"@class":"com.test.A","i":3}

测试代码:

    A a = new A(3);
    String str = mapper.writeValueAsString(a);
    Base base = mapper.readValue(str, Base.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多