[java] Deserializzare JSON con Jackson in tipi polimorfici - Un esempio completo mi sta dando un errore di compilazione


0 Answers

Un modo semplice per abilitare la serializzazione / deserializzazione polimorfica tramite la libreria di Jackson è di configurare globalmente il mappatore di oggetti Jackson (jackson.databind.ObjectMapper) per aggiungere informazioni, come il tipo di classe concreta, per determinati tipi di classi, come le classi astratte.

Per fare ciò, assicurati che il tuo mapper sia configurato correttamente. Per esempio:

Opzione 1: supporto serializzazione / deserializzazione polimorfica per classi astratte (e classi Typ typed)

jacksonObjectMapper.enableDefaultTyping(
    ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE); 

Opzione 2: supporto serializzazione / deserializzazione polimorfica per classi astratte (e classi Typ typed) e matrici di questi tipi.

jacksonObjectMapper.enableDefaultTyping(
    ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS); 

Riferimento: http://wiki.fasterxml.com/JacksonPolymorphicDeserialization

Question

Sto tentando di elaborare un tutorial del programmatore Bruce che dovrebbe consentire la deserializzazione del JSON polimorfo.

L'elenco completo può essere trovato qui Tutorial Bruce Programmer (Grandi cose tra due)

Ho lavorato ai primi cinque senza problemi, ma ho avuto un problema con l'ultimo (Esempio 6), che ovviamente è quello che ho davvero bisogno di lavorare.

Sto ottenendo il seguente errore al momento della compilazione

Il metodo readValue (JsonParser, Class) nel tipo ObjectMapper non è applicabile per gli argomenti (ObjectNode, Class)

ed è causato dalla porzione di codice

  public Animal deserialize(  
      JsonParser jp, DeserializationContext ctxt)   
      throws IOException, JsonProcessingException  
  {  
    ObjectMapper mapper = (ObjectMapper) jp.getCodec();  
    ObjectNode root = (ObjectNode) mapper.readTree(jp);  
    Class<? extends Animal> animalClass = null;  
    Iterator<Entry<String, JsonNode>> elementsIterator =   
        root.getFields();  
    while (elementsIterator.hasNext())  
    {  
      Entry<String, JsonNode> element=elementsIterator.next();  
      String name = element.getKey();  
      if (registry.containsKey(name))  
      {  
        animalClass = registry.get(name);  
        break;  
      }  
    }  
    if (animalClass == null) return null;  
    return mapper.readValue(root, animalClass);
  }  
} 

Specificamente dalla linea

return mapper.readValue (root, animalClass);

Qualcuno si è imbattuto in questo prima e se sì, c'era una soluzione?

Apprezzerei qualsiasi aiuto che qualcuno possa dare Grazie in anticipo a Jon D.






Related