杰克逊基于对象属性反序列化为POJO

时间:2013-04-05 14:31:27

标签: java json jaxb jackson

是否可以根据JSON的内容使用Jackson将JSON反序列化为两种类型之一?

例如,我有以下Java(技术上是Groovy,但这并不重要)接口和类:

interface Id {
    Thing toThing() 
}

class NaturalId implements Id {

    final String packageId

    final String thingId

    Thing toThing() {
        new PackageIdentifiedThing(packageId, thingId)
    }         
}

class AlternateId implements Id {

    final String key

    Thing toThing() {
        new AlternatelyIdentifiedThing(key)
    }
}

我将收到的JSON将如下所示:

此JSON应映射到NaturalId {"packageId": "SomePackage", "thingId": "SomeEntity"}

此JSON应映射到AlternateId {"key": "SomeUniqueKey"}

有没有人知道如何使用Jackson 2.x完成此操作而不包括类型ID?

3 个答案:

答案 0 :(得分:6)

这些是实现Id的唯一两个类吗?如果是这样,您可以编写IdDeserializer类并将@JsonDeserialize(using = IdDeserializer.class)放在Id接口上,反序列化器将查看JSON并确定要反序列化的对象。

编辑:JsonParser正在流媒体,所以看起来应该是这样的:

public Id deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    ObjectNode node = jp.readValueAsTree();
    Class<? extends Id> concreteType = determineConcreteType(node); //Implement 
    return jp.getCodec().treeToValue(node, concreteType);
}

答案 1 :(得分:0)

使用@JsonIgnore

注释您的方法
@JsonIgnore
Thing toThing() {
    new PackageIdentifiedThing(packageId, thingId)
}  

答案 2 :(得分:0)

使用Jackson2,您可以使用泛型轻松编组到不同的类:

key