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() +  "]" ;
     }
 
}
分类:  android solve


本文转自wanqi博客园博客,原文链接:http://www.cnblogs.com/wanqieddy/p/4013205.html,如需转载请自行联系原作者


相关文章
|
1月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
87 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
2月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
153 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
3月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
218 0
在Java中处理JSON数据:Jackson与Gson库比较
|
3月前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
156 1
|
4月前
|
JSON Java fastjson
java小工具util系列3:JSON和实体类转换工具
java小工具util系列3:JSON和实体类转换工具
47 2
|
4月前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
183 2
|
5月前
|
JSON Java API
在 Java 中解析 JSON ArrayList 的详细指南
【8月更文挑战第23天】
116 1
|
5月前
|
JSON Java 数据格式
Java系列之:如何取出嵌套JSON中的数据值
这篇文章介绍了如何在Java中取出嵌套JSON数据值的方法,通过使用`JSONObject`类及其`getJSONObject`和`get`方法来逐步解析和提取所需的数据。
Java系列之:如何取出嵌套JSON中的数据值
|
5月前
|
JSON Java 数据格式
Java系列之:生成JSON字符串
这篇文章介绍了两种在Java中生成JSON字符串的方法:使用`JSONObject`类及其`toJSONString`方法来动态生成,以及手动拼接字符串的方式来创建JSON格式的字符串。
Java系列之:生成JSON字符串
|
5月前
|
JSON 前端开发 JavaScript
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
这篇文章讨论了前端Vue应用向后端Spring Boot服务传输数据时发生的类型不匹配问题,即后端期望接收的字段类型为`int`,而前端实际传输的类型为`Boolean`,导致无法反序列化的问题,并提供了问题的诊断和解决方案。
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
下一篇
开通oss服务