Java对象的序列化与反序列化-Json篇

2019-09-28 17:19:50

参考地址 Java对象的序列化与反序列化-Json篇

说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输。或者在RPC(远程方法调用)时可能会用到。 

但其实若是用于数据传输,xml和json两种数据格式用得更多一些。但是为什么不用XStream呢,XStream确实好用,但是在Applet环境下可以使用的xml类库也就只有jdom了,连dom4j在Applet环境下都没有权限使用(Java反射的某些特性是需要权限的,Applet的安全机制不允许)。 

扯远了,本文要说的是Java对象与Json的相互转换。目前Java常用的Json类库有3种,即fastjson、jackson和gson,分别介绍如何将一个Java对象转换成Json和将一个Json字符串转换成Java对象,其实它们的用法大同小异。 

一、首先看Maven依赖 
二、需要序列化的POJO和初始化代码 
三、fastjson的使用 
四、jackson的使用 
五、gson的使用 

一、首先看Maven依赖 

若不会maven,请参考Maven的基本用法:http://jisonami.iteye.com/blog/2300036 

复制代码

 1 <!-- json -->  
 2 <!-- 引入fastjson依赖 -->  
 3 <dependency>  
 4     <groupId>com.alibaba</groupId>  
 5     <artifactId>fastjson</artifactId>  
 6     <version>1.2.12</version>  
 7 </dependency>  
 8 <!-- 引jackson依赖 -->  
 9 <!-- jackson核心包,必选,提供基于“流模式”解析的API -->  
10 <dependency>  
11     <groupId>com.fasterxml.jackson.core</groupId>  
12     <artifactId>jackson-core</artifactId>  
13     <version>2.7.4</version>  
14 </dependency>  
15 <!-- jackson注解包,可选,提供注解功能 -->  
16 <dependency>  
17     <groupId>com.fasterxml.jackson.core</groupId>  
18     <artifactId>jackson-annotations</artifactId>  
19     <version>2.7.4</version>  
20 </dependency>  
21 <!-- jackson数据绑定包,可选,提供基于“对象绑定”和“树模型”相关API -->  
22 <dependency>  
23     <groupId>com.fasterxml.jackson.core</groupId>  
24     <artifactId>jackson-databind</artifactId>  
25     <version>2.7.4</version>  
26 </dependency>  
27 <!-- 引入gson依赖 -->  
28 <dependency>  
29     <groupId>com.google.code.gson</groupId>  
30     <artifactId>gson</artifactId>  
31     <version>2.6.2</version>  
32 </dependency>

复制代码

 

二、需要序列化的POJO和初始化代码 
以下3种类库的使用均使用下面这个POJO 

复制代码

 1 public class User {  
 2     public User(){}  
 3     private String id;  
 4     private String name;  
 5     private String password;  
 6     public String getId() {  
 7         return id;  
 8     }  
 9     public void setId(String id) {  
10         this.id = id;  
11     }  
12     public String getName() {  
13         return name;  
14     }  
15     public void setName(String name) {  
16         this.name = name;  
17     }  
18     public String getPassword() {  
19         return password;  
20     }  
21     public void setPassword(String password) {  
22         this.password = password;  
23     }  
24     @Override  
25     public String toString() {  
26         return "User [id=" + id + ", name=" + name + ", password=" + password  
27                 + "]";  
28     }     
29 }

复制代码

 

复制代码

 1 /** 
 2  * 初始化User对象 
 3  * @return user 
 4  */   5 private static User initUser(){  
 6     User user = new User();  
 7     user.setId("1");  
 8     user.setName("jison");  
 9     user.setPassword("jison");  
10     return user;  
11 }

复制代码

 

三、fastjson的使用 
fastjson的主要工具类是JSON,以下代码实现Java对象的序列化与反序列化 

1 // 将Java对象序列化为Json字符串  2     String objectToJson = JSON.toJSONString(initUser());  
3     System.out.println(objectToJson);  
4     // 将Json字符串反序列化为Java对象  5     User user = JSON.parseObject(objectToJson, User.class);  
6     System.out.println(user);

 

四、jackson的使用 
jackson我们经常用到的是它的数据绑定包下的ObjectMapper类,以下代码实现Java对象的序列化与反序列化 

复制代码

ObjectMapper objectMapper = new ObjectMapper();  
    // 将Java对象序列化为Json字符串  
    String objectToJson = objectMapper.writeValueAsString(initUser());  
    System.out.println(objectToJson);  
    // 将Json字符串反序列化为Java对象  
    User user = objectMapper.readValue(objectToJson, User.class);  
    System.out.println(user);

复制代码

 

五、gson的使用 
gson的主要工具类是Gson,使用GsonBuilder构造,以下代码实现Java对象的序列化与反序列化 

复制代码

1 Gson gson = new GsonBuilder().create();  
2     // 将Java对象序列化为Json字符串  3     String objectToJson = gson.toJson(initUser());  
4     System.out.println(objectToJson);  
5     // 将Json字符串反序列化为Java对象  6     User user = gson.fromJson(objectToJson, User.class);  
7     System.out.println(user);

复制代码

 

以上3种json类库的完整代码如下: 

复制代码

 1 public class JsonUtils {  
 2    3     /** 
 4      * 初始化User对象 
 5      * @return user 
 6      */   7     private static User initUser(){  
 8         User user = new User();  
 9         user.setId("1");  
10         user.setName("jison");  
11         user.setPassword("jison");  
12         return user;  
13     }  
14       15     public static void main(String[] args) throws Exception {  
16         // fastjson用法  17         fastjson();  
18         // jackson用法  19         jackson();  
20         // gson用法  21         gson();  
22     }  
23       24     private static void fastjson(){  
25         // 将Java对象序列化为Json字符串  26         String objectToJson = JSON.toJSONString(initUser());  
27         System.out.println(objectToJson);  
28         // 将Json字符串反序列化为Java对象  29         User user = JSON.parseObject(objectToJson, User.class);  
30         System.out.println(user);  
31     }  
32       33     private static void jackson() throws Exception{  
34         ObjectMapper objectMapper = new ObjectMapper();  
35         // 将Java对象序列化为Json字符串  36         String objectToJson = objectMapper.writeValueAsString(initUser());  
37         System.out.println(objectToJson);  
38         // 将Json字符串反序列化为Java对象  39         User user = objectMapper.readValue(objectToJson, User.class);  
40         System.out.println(user);  
41     }  
42       43     private static void gson(){  
44         Gson gson = new GsonBuilder().create();  
45         // 将Java对象序列化为Json字符串  46         String objectToJson = gson.toJson(initUser());  
47         System.out.println(objectToJson);  
48         // 将Json字符串反序列化为Java对象  49         User user = gson.fromJson(objectToJson, User.class);  
50         System.out.println(user);  
51     }  
52 }

复制代码


  • 2019-05-21 12:43:26

    (重要)RecycleView的缓存机制

    RecycleView的四级缓存是由三个类共同作用完成的,Recycler、RecycledViewPool和ViewCacheExtension。Recycler用于管理已经废弃或者与RecyclerView分离的ViewHolder,这里面有两个重要的成员,为可以看见的屏幕的内部缓存成员mAttachedScrap、mChangedScrap和滑出屏幕外的外部缓存成员mCachedViews二者共同完成ViewHolder的缓存;RecycledViewPool类是用来缓存整体所有的ViewHolder,是对mCachedViews缓存的补充;ViewCacheExtension是扩展内的缓存对象,默认不加载,需实现方法getViewForPositionAndType(Recycler recycler, int position, int type)来实现自己的缓存。接下来对四级缓存一步步介绍。

  • 2019-05-21 12:44:31

    对嵌套RecyclerView的优化

    RecyclerView 是一个更高级的 ListView ,它可以重用view避免额外创建太多的view从而带来流畅的滚动性能。RecyclerView通过叫做 View pool 的东西持有不再可见的 view ,让它可被回收

  • 2019-05-25 14:54:50

    commit your changes or stash them before you can merge

    Your local changes to the following files would be overwritten by merge:         protected/config/main.php Please, commit your changes or stash them before you can merge. --------------------- 作者:陈小峰_iefreer 来源:CSDN 原文:https://blog.csdn.net/iefreer/article/details/7679631 版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2019-05-27 10:43:34

    IntelliJ IDEA中C盘文件过大怎么办

    当我在D:\ 安装完IDEA9.0之后,建立了一个工程,发现C:\Users\Administrator\.IntelliJIdea90 竟然增大到了500+M,并且随着使用在逐渐增大,这样占用系统盘资源是非常让人不爽的,那么如何将其修改到其他路径呢?

  • 2019-05-28 13:33:20

    BRVAH+MTRVA,复杂?不存在的

    言归正传,这样的一个首页,我们需要做怎么样的基础工作呢?或者说,碰到以后更复杂的页面我们应该怎么做?这里小提示下,不要再用什么类似ScrollView的这种东西了,诶,好像说的有点绝对,尽量不要用,这不是谷歌想要看到的,5.0谷歌推出了RecyclerView,从它的整个设计架构来看,简直就是为这而生的。而RecyclerView的视图是通过Adapter来渲染的。原始的Adapter,让人很蛋疼,重复工作太多,我们应该要有封装的思想,把最需要的部分提供出来,其它不用管。

  • 2019-05-29 14:19:19

    解决Git中fatal: refusing to merge unrelated histories

    Git的报错 在使用Git的过程中有时会出现一些问题,那么在解决了每个问题的时候,都需要去总结记录下来,下次不再犯。 一、fatal: refusing to merge unrelated histories 今天在使用Git创建项目的时候,在两个分支合并的时候,出现了下面的这个错误。