2013-04-05 95 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

相關問題