使用jackson对Java对象与JSON字符串相互转换的一些总结

  总结一下自己使用 jackson 处理对象与 JSON 之间相互转换的心得。
jackson 是一个用 Java 编写的,用来处理 JSON 格式数据的类库,它速度非常快,目前来看使用很广泛,逐渐替代了 Gson json-lib
如果直接引入 jar 包,可以访问这个地址下载 http://jackson.codehaus.org/1.9.11/jackson-all-1.9.11.jar
如果使用 maven 构建项目,加入下面的依赖

<dependency>

       <groupId>org.codehaus.jackson</groupId>

       <artifactId>jackson-mapper-asl</artifactId>

       <version>1.9.11</version>

    </dependency>
     无代码无真相,为了最简单的说明,我直接上代码。

public class User {

    private String name;

    private Gender gender;

    private List<Account> accounts;

    省略getset方法

...

}

public enum Gender {

    MALE,

    FEMALE

}

public class Account {

    private Integer id;

    private String cardId;

    private BigDecimal balance;

 private Date date;

 省略getset方法

...

}

public static void main(String[] args) throws Exception {

       User user = new User();

       user.setName("菠萝大象");

       user.setGender(Gender.MALE);

       List<Account> accounts = new ArrayList<Account>();

       Account account = new Account();

       account.setId(1);

       account.setBalance(BigDecimal.valueOf(1900.2));

       account.setCardId("423335533434");

       account.setDate(new Date());

       accounts.add(account);

       account = new Account();

       account.setId(2);

       account.setBalance(BigDecimal.valueOf(5000));

       account.setCardId("625444548433");

       account.setDate(new Date());

       accounts.add(account);

       user.setAccounts(accounts);

ObjectMapper mapper = new ObjectMapper();

       mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, Boolean.TRUE);

       String json = mapper.writeValueAsString(user);

       System.out.println("Java2Json: "+json);

       user = mapper.readValue(json, User.class);

       System.out.println("Json2Java: "+mapper.writeValueAsString(user));

}
     mapper.configure(SerializationConfig.Feature. INDENT_OUTPUT , Boolean. TRUE ); 这是辅助设置,控制格式化输出。
     之前使用的 mapper.getSerializationConfig().setXxx 方法现在很多都已经被标注为 @Deprecated 了,因此请大家使用上面的方式处理。
     SerializationConfig.Feature 枚举里面还有很多其它的设置项,比如日期,比如要 不要输出 null 值等等。其它的还有:
         org.codehaus.jackson.JsonGenerator.Feature.*  
         org.codehaus.jackson.JsonParser.Feature.*
     让我们来看看输出结果,两次转换之后,打印出来的字符串应该是一样的:
    
     OK ,果然结果是一致的,大家现在应该会使用 jackson 进行 Java Json 的互相转换了吧?恩,现在再考虑一种情况,如果想将 List<User> JSON 字符串反转为泛型,应该怎么做呢?
     想这样: mapper.readValue(json, List<User>. class ) ?这可是错误的,这里的参数是 Class<T> valueType valueType Class<T> 类的对象。如上面所示 User. class   就是 Class<User> 类的对象。因此要想获得泛型的集合类型需要通过其它办法:
/**
 * 获取泛型的Collection Type
 * @param jsonStr json字符串
 * @param collectionClass 泛型的Collection
 * @param elementClasses 元素类型
 */
public static <T> T readJson(String jsonStr, Class<?> collectionClass, Class<?>... elementClasses) throws Exception {

       ObjectMapper mapper = new ObjectMapper();

       JavaType javaType = mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);

       return mapper.readValue(jsonStr, javaType);

}
     定义一个 List <User> ,向里面添加两次 user ,先调用 writeValueAsString方法 打印出 json ,再调用 readJson 方法,这不仅可以转换泛型 List<T> ,还可以用于其它集合,比如 Map<K,V> 等等。
     List<User> list =  readJson(json, List. class , User. class );  
     ObjectMapper 可以让对象与 JSON 之间相互转换,除此之外 Jackson 还提供了 JsonGenerator   JsonParser   这两个类,它们可以更细粒度的处理序列化与反序列化。调用 ObjectMapper writeValueAsString readValue 方法, 最终还是会交给 JsonGenerator   JsonParser   去处理,对此还有疑惑的话,可以去看看这两个方法的源码。
转自: http://www.blogjava.net/ bolo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火狐怎么放大页面?火狐浏览器页面放大技巧

和许多浏览器产品一样&#xff0c;火狐浏览器也支持用户对当前页面进行缩放。当然&#xff0c;不同浏览器产品&#xff0c;页面缩放功能隐藏的位置也各不相同!那么&#xff0c;火狐怎么放大页面呢?下面是小编分享的火狐浏览器页面放大技巧&#xff0c;感兴趣的朋友可不要错过了…

JSON和JS对象之间的互转

1. jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2. 浏览器支持的转换方式(Firefox&#xff0c;chrome&#xff0c;opera&#xff0c;safari&#xff0c;ie9&#xff0c;ie8)等浏览器&#xff1a; JSON.pa…

森林中的三个小矮人

今天七小编分享经典童话故事《森林中的三个小矮人》&#xff0c;故事中两个小姑娘&#xff0c;一位心地善良&#xff0c;说话会吐出金子;一位丑陋坏心&#xff0c;说话会吐出蛤蟆;来看看怎么回事吧! 从前&#xff0c;一位死了妻子的男人和一位死了丈夫的女人结了婚&#xff0c…

转码与重定向的区别之于SpringMVC

使用转发时&#xff0c;JSP容器将使用一个内部的方法来调用目标页面&#xff0c;新的页面继续处理同一个请求&#xff0c;而浏览器将不会知道这个过程。 与之相反&#xff0c;重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因此转发要比重定向更快,而且跳转到的…

Spring的ApplicationEvent的使用

Spring的ApplicationEvent的使用 Spring 3.0中提供了很多类似*Aware的类&#xff0c;其中ApplicationContextAware接口可以实现我们在初始化bean的时候给bean注入ApplicationConxt&#xff08;Spring上下文对象&#xff09;对象。ApplicationContextAware接口提供了publishEven…

谷歌浏览器地址栏记录怎么删除 Chrome浏览器地址栏记录清除方法

相信那些经常使用谷歌Chrome浏览器的朋友都清楚&#xff0c;这款浏览器软件会在地址栏保存大量的访问记录&#xff0c;其中也包括一些不想保存下来的!那么&#xff0c;谷歌浏览器地址栏记录要怎么删除呢?不清楚具体方法的朋友&#xff0c;还不赶紧收藏学习一下。 方法步骤 在…

使用Java的BlockingQueue实现生产者-消费者

BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。 BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1、ArrayBlockingQueue&#xff1a;一个由数组支持的有界阻塞队列&#xff0c;规定大小的BlockingQueue,其构造函数必须带一个int参数…

win7系统怎么查看主板信息

win7系统怎么查看主板信息?主板是一台计算机最重要的硬件设备之一&#xff0c;它不仅是所有硬件系统的核心&#xff0c;也是机箱中最大的电路板。今天小编就给大家带来了win7系统查看主板信息的方法&#xff0c;一起来看看win7系统怎么查看主板信息的吧。 win7系统怎么查看主…

Mybatis判断int类型是否为空

症状 : 域名筛选在选择正式,测试的时候没问题,选择终止的时候筛选结果不对分析:正式:1测试:2终止:0不选:null选择终止的时候得到了和不选一样的结果,下图为sql判断语句,以前一直都是这么判断的没有出现过问题 错误所在:通过观察log打印的sql语句发现status0时上述条件是不成立的…

win7电脑蓝屏的解决方法

在我们使用电脑的过程中想必有很多人都会遇到蓝屏现象吧&#xff0c;蓝屏指的是操作系统在无法从一个系统错误中恢复过来时所显示的屏幕图像&#xff0c;导致蓝屏现象的原因有很多&#xff0c;今天我们来看看win7电脑蓝屏的解决方法吧。 win7电脑蓝屏的解决方法 1、今天带来的…

$.extend()和(function($){….})(jQuery)

1. JS中substring与substr的区别 之前在项目中用到substring方法&#xff0c;因为C#中也有字符串的截取方法Substring方法&#xff0c;当时也没有多想就误以为这两种方法的使用时一样的。这样就直接按照在C#中使用Substring的方式&#xff0c;直接在js中用了substring&#…

积米浏览器如何清除浏览数据

相信大家都知道&#xff0c;大多数浏览器都会自动缓存浏览数据&#xff0c;而缓存的数据多了也就会直接影响到网页的浏览速度&#xff0c;所以最好是能够经常或者定期去清除浏览数据。那么&#xff0c;如何清除浏览数据呢?下面&#xff0c;以积米浏览器为例&#xff0c;我们一…

Java文件保存与删除工具类

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;/*** * author ahomeeye* * 2012-7-26 下午3:50:50 文件操作工具类*/ public class FileUtil {// 保存文件public static void saveFile(String newsRootPath, String filename…

win7在网上邻居上看不到别的电脑如何解决

近期在网上看到很多用户询问说win7纯净版系统在网上邻居上看不到别的电脑是什么情况呢?一般情况下&#xff0c;我们可以通过网上邻居和别的电脑共享文件、图片、视频等等。可是有时候Win7系统在网上邻居上看不到别的电脑&#xff0c;也无法搜索到。有什么办法能解决此故障问题…

循环删除List集合的错误

症状:不是郝柱也能看到灾备分析:调试发现动作中有两个灾备,不过只过滤了其中一个 错误所在:代码如下,这里for循环删除List逻辑出问题了,犯了一个比较基础的错误 : 两个灾备动作索引是相邻的,当我remove掉第一个时紧跟着的动作就会取代它原来的位置,最终导致问题发生 修改方案:解…

win10使用网络共享功能的方法

win10系统有一个网络共享功能&#xff0c;可以实现局域网之间文件和打印机的共享操作&#xff0c;从而有效提高资源共享&#xff0c;实现更高效的办公需求。好多新手用户不知道网络共享功能怎么使用?为此&#xff0c;本文教程来和大家详细说明一些使用方法。 具体方法如下: …

JSON转List

JSON转List在平时的开发中经常遇到&#xff0c;这里介绍两张方法&#xff1a; 1.使用jackson&#xff08;推荐&#xff0c;支持嵌套复杂结构&#xff09;&#xff1a; ObjectMapper mapper new ObjectMapper(); JavaType javaType mapper.getTypeFactory().constructPara…

双击ie浏览器没反应打不开的解决方法

双击ie浏览器后没反应怎么办?双击ie浏览器打不开怎么解决?ie浏览器是众多网民朋友比较熟悉的网页浏览器之一&#xff0c;但是不少用户经常会遇到双击ie浏览器没反应或者双击ie浏览器打不开的尴尬情况&#xff0c;这个问题要如何解决呢?为此小编特整理下文&#xff0c;以下解…

ajax中return取不到值的问题

症状:机器迁移时判断JS返回取不到值分析 :调试发现data是有值的&#xff0c;而且下断点调试发现这段ajax还没走完&#xff0c;后面的逻辑已经开始走了错误所在:ajax之所以叫ajax它首先是异步的&#xff0c;顺序执行的程序不需要等待ajax跑完才继续执行 修改方案:将默认为true的…

UC浏览器如何调节手机屏幕亮度

uc浏览器是一个非常好用的社交服务软件&#xff0c;用户可以使用手机随时进行线上搜索&#xff0c;这款软件使用超级的方便&#xff0c;用户在线上阅读的时候&#xff0c;有很多功能可以使用&#xff0c;在进行线上阅读的时候&#xff0c;可以对页面的文字&#xff0c;背景&…