2013-04-05 153 views
2

是否有可能使用Jackson将JSON反序列化为基于JSON内容的两种类型之一?Jackson根据对象属性反序列化为POJO

例如,我有以下的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来完成这项工作,而不包括type id的?

回答

5

这是唯一实现Id的两个类吗?如果是这样,您可以在Id接口上编写IdDeserializer类并将@JsonDeserialize(using = IdDeserializer.class),并且解串器将查看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); 
} 
+0

此刻;只有这两个。在不久的将来可能会有三分之一,但我预计不会出现Id类型的爆炸式增长。 我打算查看自定义的Deserializer方法,因为它可能是最有效的。 – 2013-04-05 14:59:35

+0

我建议你的反序列化器只应该算出'Id'要反序列化到哪个实现,然后委托给Jackson反序列化为具体类型。这将使得任何有关具体类型的杰克逊注解仍然受到尊重。 (确保在具体类型上放置'@JsonDeserialize(using = None.class)'以避免无限的反序列化循环) – HiJon89 2013-04-05 19:12:11

+0

HiJon是个好主意,但我似乎遇到了这样的问题;当我调用mapper.readValue(jsonParser,ConcreteType)时,出现以下错误:“由于输入结束而无法映射”,其中jsonParser是传入反序列化方法的那个,而ConcreteType是我确定的类型是正确的。有任何想法吗?我有一种感觉,它与API的流式性质有关。 – 2013-04-05 22:47:44

0

注解你的方法与@JsonIgnore

@JsonIgnore 
Thing toThing() { 
    new PackageIdentifiedThing(packageId, thingId) 
} 
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; 
} 
+0

我纠正:unmarshall – Vince 2017-12-04 11:02:30

相关问题