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.     }  

 运行时:

 

参考:Jackson将json字符串转换成泛型List

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

作者:黄威

联系方式:1287789687@qq.com

时间: 2024-12-03 05:42:50

Jackson 反序列化为List的相关文章

对象序列化反序列化为xml

序列化对象为xml: /// <summary> /// 序列化对象 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="t">对象</param> /// <returns></returns> public static string Serialize<T>(T

JDynamic :支持Json反序列化为Dynamic对象

2010年 .NET 4.0 发布前后,从3.5向4.0迁移,那时也有一些异构系统的需求,主要是和PHP打交道,通信使用的HTTP 格式为JSON. 不过因为接口比较多,也没有统一规范,PHP端相对是制定接口的一方,所以.NET中反序列化时就显得被动了一些. 当时看中了Dynamic方便使用的优势,并以ASP.NET MVC中 ViewBag->ViewData的转换为参考,制定了一些简单的测试用例,后期就是完善了这些测试用例,使之可以成为一个简单易用的工具类. 最近整理了一下,把这个工具类放到

Retrofit 2.0 (v2.0.0-beta4)

原文地址:Retrofit 2.0 1.介绍 Retrofit可以将你的HTTP API转化为JAVA的接口的形式.例如: public interface GitHubService {   @GET("users/{user}/repos")   Call<List<Repo>> listRepos(@Path("user") String user);} 而Retrofit类能够生成对应接口的实现.例如: Retrofit retrof

架构师之路-在Dubbo中开发REST风格的远程调用

概述 dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议).WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持. 有鉴于此,我们基于标准的Java REST API--JAX-RS 2.0(Java API for REST

spring mvc3 + fastjson

spring 3可以支持Rest风格参数,其内置了jackson框架作为REST的json参数转换成javabean对象,以及bean对象转换成json参数. 下文以spring 3.1.1 + fastjson为例(低于这个版本的不知道能不能行),说明如何使用springmvc构造resuful参数及输出. 不说废话了,直接上代码:Controller类: @Controller public class TestCon { @ResponseBody @RequestMapping("/te

Java RESTful Web Service实战(第2版)

Java核心技术系列 Java RESTful Web Service实战 (第2版) 韩陆 著 图书在版编目(CIP)数据 Java RESTful Web Service实战 / 韩陆著. -2版. -北京:机械工业出版社,2016.7 (Java核心技术系列) ISBN 978-7-111-54213-1 Ⅰ. J-   Ⅱ. 韩-   Ⅲ. JAVA语言-程序设计   Ⅳ. TP312 中国版本图书馆CIP数据核字(2016)第156331号 Java RESTful Web Servi

jsp-怎么把JSON字符串转换成java字符串或数组或者集合

问题描述 怎么把JSON字符串转换成java字符串或数组或者集合 var chk_value =[]; $('input[name="zd_resourcecb"]:checked').each(function(){ chk_value.push($(this).val()); }); var chk_values = JSON.stringify(chk_value); jsp是这么写的 不过得到的是JSON字符串 ,我想要得到java类型的字符串或是数组什么的 解决方案 字符串反

Java RESTful Web Service实战(第2版) 2.3 传输格式

2.3 传输格式 本节要考虑的就是如何设计表述,即传输过程中数据采用什么样的数据格式.通常,REST接口会以XML和JSON作为主要的传输格式,这两种格式数据的处理是本节的重点.那么Jersey是否还支持其他的数据格式呢?答案是肯定的,让我们逐一掌握各种类型的实现. 2.3.1 基本类型 Java的基本类型又叫原生类型,包括4种整型(byte.short.int.long).2种浮点类型(float.double).Unicode编码的字符(char)和布尔类型(boolean). 阅读指南 本

Java编程中将String类型转为Date类型实例

最近在开发Json数据反序列化为Java对象的时候发现spring mvc 和 Jackson 对Date类型对支持不是特别好,虽然在Java对象序列化为Json数据的过程中提供了便利的注解,但是反序列化却没有,于是就引出了下面的问题,我需要手工的将字符串转换为Date类型的数据,java.text.SimpleDateFormat 为我们提供了这种转换的基础设施.如下列出了的格式化模式的简单定义,如果 'M' 大于等于3位, 月份会显示为字母,否则是数字. 更详细的定义请参考 java.tex