4

是否可以根据 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"}

有谁知道我如何在不包括类型 ID 的情况下使用 Jackson 2.x 来完成此任务?

4

3 回答 3

7

这些是唯一实现的两个类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);
}
于 2013-04-05T14:38:30.723 回答
0

使用 @JsonIgnore 注释您的方法

@JsonIgnore
Thing toThing() {
    new PackageIdentifiedThing(packageId, thingId)
}  
于 2013-04-05T15:14:04.573 回答
0

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

private <T> T json2Object(String jsonString, String type, Class<T> clazz) {
    JsonNode jsonObjectNode = getChildNode(jsonString, type);       
    T typeObject = null;
    try {
        typeObject = jacksonMapper.treeToValue(jsonObjectNode, clazz);
    } catch (JsonProcessingException jsonProcessingException) {
        LOGGER.severe(jsonProcessingException);
    }
    return typeObject;
}
于 2017-12-04T10:57:46.253 回答