Jackson 反序列化为List

简介:

使用Jackson 如何把json字符串反序列化为List呢? 
(List中是自定义对象) 
先看下常规的反序列化:

Java代码   收藏代码
  1. @Test  
  2.     public void test_reserialize(){  
  3.         String jsonInput = "{\"addrr\":{\"country\":\"中国\",\"state\":\"湖北省\",\"street\":\"清河\"},\"age\":25,\"hobby\":\"\",\"name\":\"黄威\"}";  
  4.         ObjectMapper mapper = new ObjectMapper();  
  5.         Student student;  
  6.         try {  
  7.             student = mapper.readValue(jsonInput, Student.class);  
  8.             System.out.println(student.getAddrr().getStreet());  
  9.             System.out.println(student.getName());  
  10.         } catch (Exception e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.     }  

 运行结果

 

序列化

Java代码   收藏代码
  1. @Test  
  2.     public void test_004(){  
  3.         List<Teacher> list=new ArrayList<Teacher>();  
  4.         Teacher t=new Teacher();  
  5.         t.setId(2);  
  6.         t.setName("雄鹰表");  
  7.         t.setTitle("aa");  
  8.         list.add(t);  
  9.   
  10.         t=new Teacher();  
  11.         t.setId(3);  
  12.         t.setName("陈定生");  
  13.         t.setTitle("bb");  
  14.         list.add(t);  
  15.   
  16.         t=new Teacher();  
  17.         t.setId(4);  
  18.         t.setName("张阿勇");  
  19.         t.setTitle("cc");  
  20.         list.add(t);  
  21.   
  22.         ObjectMapper mapper = new ObjectMapper();  
  23.         String content;  
  24.         try {  
  25.             content = mapper.writeValueAsString(list);  
  26.             System.out.println(content);  
  27.         } catch (JsonGenerationException e) {  
  28.             e.printStackTrace();  
  29.         } catch (JsonMappingException e) {  
  30.             e.printStackTrace();  
  31.         } catch (IOException e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  

 

运行结果
[{“id”:2,”title”:”aa”,”name”:”雄鹰表”},{“id”:3,”title”:”bb”,”name”:”陈定生”},{“id”:4,”title”:”cc”,”name”:”张阿勇”}]

反序列化 
把上述json字符串反序列化为List 
代码如下:

Java代码   收藏代码
  1. @Test  
  2.     public void test_006(){  
  3.         String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]";  
  4.         ObjectMapper mapper = new ObjectMapper();  
  5.         List student;  
  6.         try {  
  7.             student = mapper.readValue(jsonInput, List.class);  
  8.             System.out.println(student.size());  
  9.         } catch (Exception e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  

 运行时 

 没有达到预期效果,虽然反序列化成了List,但是并不是List<Teacher>,而是List<HashMap> 

如何解决这个问题呢? 
解决方法:使用mapper.getTypeFactory().constructParametricType

Java代码   收藏代码
  1. /**    
  2.      * 获取泛型的Collection Type   
  3.      * @param collectionClass 泛型的Collection    
  4.      * @param elementClasses 元素类    
  5.      * @return JavaType Java类型    
  6.      * @since 1.0    
  7.      */     
  8.  public static JavaType getCollectionType(ObjectMapper mapper,Class<?> collectionClass, Class<?>... elementClasses) {     
  9.      return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);     
  10.  }  
  11.     @Test  
  12.     public void test_006(){  
  13.         String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]";  
  14.         ObjectMapper mapper = new ObjectMapper();  
  15.         List student;  
  16.         try {  
  17.             student = mapper.readValue(jsonInput, getCollectionType(mapper, List.class, Teacher.class));  
  18.             System.out.println(student.size());  
  19.         } catch (Exception e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  

 运行时:

 

http://blog.csdn.net/hw1287789687/article/details/46955179

作者:黄威

联系方式:1287789687@qq.com

相关文章
|
5月前
|
JSON Java 数据格式
Java jackson 由String转成List和各种对象
时间久了,会忘记具体怎么转,记录一下,后面方便使用
76 1
|
9月前
|
Android开发
Android 中使用Gson进行list集合的序列化与反序列化
Android 中使用Gson进行list集合的序列化与反序列化
108 0
|
11月前
|
消息中间件 JSON Java
RabbitMQ竟然无法反序列化List
最近在接到了一个需求,大概是通过RabbitMq给xx子系统同步用户数据,要提供单个同步和批量同步。内心暗喜这不简单的很嘛。三下五除二就把代码给写完了但是在联调的过程中,遇到了一个比较奇葩的问题。单个用户进行同步时,子系统可以正常消费。然后进行批量同步的时候,子系统报错了。并抛出java.lang.ClassCastException提示 LinkedHashMap cannot xxxx class 。于是负责子系统的哥们笑嘻嘻的(表面笑嘻嘻)走过来对我说,不是约定List 为啥发个Map过来?看到这个错误,着实让我摸不到头脑。顿时一堆疑问用上心头, 为啥单个对象可以,List就不行
RabbitMQ竟然无法反序列化List
|
12月前
|
JSON 数据格式
Json解析问题—数组用Gson反序列化为List双引号消失
现在的目的是这样的,我想从一串Object类型的字符串,转化成对应的实体类对象。 简单来说就是把这个字符串给一个个独立分开。 我先写出实体类对象和Json的数据,看完再开始解析。
107 0
|
存储 JSON 数据库
使用jackson的@JsonProperty()进行字段修改成自己想要的,并实现json字符串和list集合相互转换
使用jackson的@JsonProperty()进行字段修改成自己想要的,并实现json字符串和list集合相互转换
647 0
使用jackson的@JsonProperty()进行字段修改成自己想要的,并实现json字符串和list集合相互转换
|
Java
MessagePack Java Jackson Dataformat - 列表(List)的序列化和反序列化
在本测试代码中,我们定义了一个 POJO 类,名字为 MessageData,你可以访问下面的链接找到有关这个类的定义。 https://github.com/cwiki-us-demo/serialize-deserialize-demo-java/blob/master/src/main/ja...
795 0
|
Java 容器 测试技术
MessagePack Java 0.6.X List, Map 对象的序列化和反序列化
为了序列化原生的容器对象例如  List 和 Map 对象,你必须使用 Template。 Template 对象是 serializer 和 deserializer 的配对。例如,为了序列化一个 List 对象,在 List 对象中 Integer 对象为元素,你可以使用下面的方法来创建一个模板对象(Template object)。
940 0
|
XML 测试技术 数据格式