Alternativa para Jackson @JsonSubTypes

9

O framework Jackson fornece uma abordagem baseada em anotação para emitir as informações de tipo durante o processo de serialização.

Eu não quero usar a anotação @JsonSubTypes na minha superclasse (Animal).

Em vez disso, quero dizer aos meus Subclasses, ou seja, Cão e Elefante, que Animal é o pai deles.

Existe alguma abordagem para fazer isso sem usar anotação na classe Animal.

Se sim, por favor, forneça um exemplo para fazer o mesmo, se possível.

A seguir está o caso que estou tentando resolver. JSON que "teste" recebe, contém o campo "tipo" como "cão" ou "elefante".

Eu quero registrar essas duas classes como subtipos da classe "Animal", mas não quero usar @JsonSubTypes no Animal.

Qualquer ajuda seria apreciada. Agradecemos antecipadamente.

@JsonTypeInfo( use = JsonTypeInfo.Id.NAME,  include = JsonTypeInfo.As.PROPERTY, property = "type")
abstract class Animal(){
      private String sound;
      private String type;

     //getters and setters

}

@JsonTypeName("dog")
Class Dog extends Animal(){
     //some attributes.
     //getters and setters
}

@JsonTypeName("elephant")
Class Elephant extends Animal(){
     //some attributes.
     //getters and setters
}


@Controller
public class MyController {

    //REST service
    @RequestMapping( value = "test")
    public  @ResponseBody String save(@RequestBody  Animal animal){

    System.out.println(animal.getClass());
    return success;

    }
}
    
por user3153309 08.07.2014 в 14:29
fonte

1 resposta

2

Esta resposta ajudará a alcançar o que você quer, mas de uma maneira um pouco diferente. Crie uma classe separada com a configuração necessária e registre-a como a classe de configuração de serialização / desserialização para a classe Animal, conforme abaixo:

  

Classe de configuração:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @Type(value = Elephant.class, name = "cat"),
    @Type(value = Dog.class, name = "dog") })
abstract class PolymorphicAnimalMixIn {
    //Empty Class
}
  

Para serializar ou desserializar:

ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(Animal.class, PolymorphicAnimalMixIn.class);  
mapper.getSerializationConfig().addMixInAnnotations(Animal.class, PolymorphicAnimalMixIn.class);

//Sample class with collections of Animal
class Zoo {  
  public Collection<Animal> animals;  
}

//To deserialize
Animal animal = mapper.readValue("string_payload", Zoo.class);

//To serialize
Animal animal = mapper.writeValueAsString(zoo);

Crédito de referência: exemplo 5

    
por SyntaX 10.11.2015 / 19:38
fonte