Deserializacja, a klasa pochodna w liscie

0

mam takie property we wrapperze:

List<Pojazd> data;

gdy ida sobie dane z jsona (deserializacja) dziala ok.

Ale czasem, zamiast Pojazd, mam zserializowane dane dla Porsche (ktore dziedziczy po Pojazd i ma kilka dodatkowych property) i wtedy jackson glupieje...
da sie to jakos zrobic, nie duplikujac drugiego wrappera z na sztywno (List<Porsche> data)

??

1

Użyj adnotacji @JsonTypeInfo i @JsonSubTypes gdzie opiszesz zasady serializacji typu. Przy czym to jest kijowe, bo nad klasa musi wiedzieć o podklasach. Inne podejście to użycie objectMapper.registerSubtypes(Dog.class, Elephant.class);.

0

modyfikacja mappera odpada, bo zajmuje sie tym taki mega uniwersalny mechanizm co do pierwszego pomyslu:

taki przyklad z neta:


    // input and output:  
    //   {  
    //     "animals":  
    //     [  
    //       {"type":"dog","name":"Spike","breed":"mutt",  
    //           "leash_color":"red"},  
    //       {"type":"cat","name":"Fluffy",  
    //           "favorite_toy":"spider ring"}  
    //     ]  
    //   }  
      
    import java.io.File;  
    import java.util.Collection;  
      
    import org.codehaus.jackson.annotate.JsonSubTypes;  
    import org.codehaus.jackson.annotate.JsonSubTypes.Type;  
    import org.codehaus.jackson.annotate.JsonTypeInfo;  
    import org.codehaus.jackson.map.ObjectMapper;  
      
    public class Foo  
    {  
      public static void main(String[] args) throws Exception  
      {  
        ObjectMapper mapper = new ObjectMapper();  
        mapper.setPropertyNamingStrategy(  
            new CamelCaseNamingStrategy());  
        Zoo zoo =   
          mapper.readValue(new File("input_4.json"), Zoo.class);  
        System.out.println(mapper.writeValueAsString(zoo));  
      }  
    }  
      
    class Zoo  
    {  
      public Collection<Animal> animals;  
    }  
      
    @JsonTypeInfo(  
        use = JsonTypeInfo.Id.NAME,  
        include = JsonTypeInfo.As.PROPERTY,  
        property = "type")  
    @JsonSubTypes({  
        @Type(value = Cat.class, name = "cat"),  
        @Type(value = Dog.class, name = "dog") })  
    abstract class Animal  
    {  
      public String name;  
    }  
      
    class Dog extends Animal  
    {  
      public String breed;  
      public String leashColor;  
    }  
      
    class Cat extends Animal  
    {  
      public String favoriteToy;  
    }  

da się jakoś zrobić, żeby nie było w oupucie wzmianki o {"type":"dog","...} tylko od razu prperty z wlasciwego obiektu, bez tego (type) ?

0

Nie da się tak zrobić bez pisania własnego mechanizmu serializacji i deserializacji, bo gdzieś musisz mieć informację jaki typ jest w danym nodzie.

0

ok, ale wracajac do pierwszego sposobu, chyba udalo mi sie pominac "type" w outpucie w ten sposob:

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes(@Type(value = Cat.class, name = "cat"))

tylko mam strasznie rozgrzebany kod, musze to jeszcze posprawdzac

dzieki dziala, z powyzsza konfiguracja (post wyzej)

mam teraz output:

"animals":
// [
// {"name":"Fluffy",
// "favorite_toy":"spider ring"}
// ]

bez niepotrzebnego w moim przypadku {"type":"cat"

0
Koziołek napisał(a):

Nie da się tak zrobić bez pisania własnego mechanizmu serializacji i deserializacji, bo gdzieś musisz mieć informację jaki typ jest w danym nodzie.

mam taki ekstremalnie ogolny, parametryzowany mechanizm serializacji/deserializacji i nie chce za bardzo tam okreslac te podtypy, niech to zostanie bardzo ogolne i czyste

0
frty55 napisał(a):

mam teraz output:

"animals":
// [
// {"name":"Fluffy",
// "favorite_toy":"spider ring"}
// ]

bez niepotrzebnego w moim przypadku {"type":"cat"

Ale jak ty chcesz pozniej takiego JSona zdeserializowac i dostac liste w ktorej sa konkretne podtypy Cat i Dog?

0

Można by spróbować poprzez szukanie specyficznego pola. Jednak to jest strasznie koślawe.

0
Koziołek napisał(a):

Można by spróbować poprzez szukanie specyficznego pola. Jednak to jest strasznie koślawe.

No, np. takim polem jest 'type' ;d

0

Type wprost określa typ :) i nie o to chodzi.

0

u mnie jest tak, ze sa tylko obiekty kalsy Dog, albo Cat i w zaleznosci od pewnego parametru serializuje, te albo te. Deserializacja idzie juz z z automatu

1 użytkowników online, w tym zalogowanych: 0, gości: 1