Java Jackson - Json Polymorphism

from://http://www.studytrails.com/java/json/java-jackson-Serialization-polymorphism.jsp

Jackson provides a way to maintain sub type information while serializing java objects. It is possible to recreate the exact sub type. The type information can be embedded into the json as a property. In the example below we create a zoo, that has a list of animals. The animal may be an elephant or a lion, and they both extend the Animal abstract class. While deserializing we want to create the exact animal type. We also demonstrate the use of @JsonTypeInfo and @JsonSubTypes annotations.

Data Serialization and Polymorphism Example

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.studytrails.json.jackson;
 
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
 
public class SerializeExample1 {
     private static String outputFile =  "zoo.json" ;
 
     public static void main(String[] args)  throws JsonGenerationException, JsonMappingException, IOException {
         // let start creating the zoo
         Zoo zoo =  new Zoo( "Samba Wild Park" "Paz" );
         Lion lion =  new Lion( "Simba" );
         Elephant elephant =  new Elephant( "Manny" );
         List<Animal> animals =  new ArrayList<>();
         animals.add(lion);
         animals.add(elephant);
         zoo.setAnimals(animals);
 
         ObjectMapper mapper =  new ObjectMapper();
         mapper.writerWithDefaultPrettyPrinter().writeValue( new FileWriter( new File(outputFile)), zoo);
     }
}

Before we look at the various classes, lets also see how to deserialize this

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.studytrails.json.jackson;
 
import java.io.File;
import java.io.IOException;
 
import org.apache.commons.io.FileUtils;
 
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
 
public class DeSerializeExample1 {
 
     public static void main(String[] args)  throws JsonParseException, JsonMappingException, IOException {
         ObjectMapper mapper =  new ObjectMapper();
         Zoo zoo = mapper.readValue(FileUtils.readFileToByteArray( new File( "zoo.json" )), Zoo. class );
         System.out.println(zoo);
     }
}

Zoo class

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.studytrails.json.jackson;
 
import java.util.List;
 
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
 
@JsonTypeInfo (use = JsonTypeInfo.Id.MINIMAL_CLASS, include = As.PROPERTY, property =  "@class" )
public class Zoo {
 
     public String name;
     public String city;
     public List<Animal> animals;
 
     @JsonCreator
     public Zoo( @JsonProperty ( "name" ) String name,  @JsonProperty ( "city" ) String city) {
         this .name = name;
         this .city = city;
     }
 
     public void setAnimals(List<animal> animals) {
         this .animals = animals;
     }
 
     @Override
     public String toString() {
         return "Zoo [name=" + name +  ", city=" + city +  ", animals=" + animals +  "]" ;
     }
 
}
 
 
</animal>

Animal Abstract class

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.studytrails.json.jackson;
 
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
 
@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property =  "@class" )
@JsonSubTypes ({  @Type (value = Lion. class , name =  "lion" ),  @Type (value = Elephant. class , name =  "elephant" ) })
public abstract class Animal {
     @JsonProperty ( "name" )
     String name;
     @JsonProperty ( "sound" )
     String sound;
     @JsonProperty ( "type" )
     String type;
     @JsonProperty ( "endangered" )
     boolean endangered;
 
}

Lion class

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.studytrails.json.jackson;
 
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
 
public class Lion  extends Animal {
 
     private String name;
 
     @JsonCreator
     public Lion( @JsonProperty ( "name" ) String name) {
         this .name = name;
     }
 
     public String getName() {
         return name;
     }
 
     public String getSound() {
         return "Roar" ;
     }
 
     public String getType() {
         return "carnivorous" ;
     }
 
     public boolean isEndangered() {
         return true ;
     }
 
     @Override
     public String toString() {
         return "Lion [name=" + name +  ", getName()=" + getName() +  ", getSound()=" + getSound() +  ", getType()=" + getType() +  ", isEndangered()="
                 + isEndangered() +  "]" ;
     }
 
}

Elephant class

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.studytrails.json.jackson;
 
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
 
public class Elephant  extends Animal {
 
     @JsonProperty
     private String name;
 
     @JsonCreator
     public Elephant( @JsonProperty ( "name" ) String name) {
         this .name = name;
     }
 
     public String getName() {
         return name;
     }
 
     public String getSound() {
         return "trumpet" ;
     }
 
     public String getType() {
         return "herbivorous" ;
     }
 
     public boolean isEndangered() {
         return false ;
     }
 
     @Override
     public String toString() {
         return "Elephant [name=" + name +  ", getName()=" + getName() +  ", getSound()=" + getSound() +  ", getType()=" + getType()
                 ", isEndangered()=" + isEndangered() +  "]" ;
     }
 
}

你可能感兴趣的:(Polymorphism)