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 }

复制代码


  • 2017-02-09 09:02:26

    两列布局——左侧宽度固定,右侧宽度自适应的两种方法

     关于左侧宽度固定,右侧宽度自适应两列布局的一种很常用的方法我相信大家都知道。就是利用左侧元素浮动,或者绝对定位的方式使其脱离常规文档流,让两个块级元素能够在同一行显示。然后右侧元素 margin-left 的值等于左侧元素宽度,这时右侧元素将紧挨着左侧元素

  • 2017-02-10 15:19:51

    Git:代码冲突常见解决方法

    如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, 在发布这个配置文件的时候,会发生代码冲突:

  • 2017-02-10 15:24:14

    linux学习之——vim简明教程

    学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。 我建议下面这四个步骤: 存活 感觉良好 觉得更好,更强,更快 使用VIM的超能力

  • 2017-02-10 16:22:13

    git历史记录查询

    查看提交历史:git log 查看提交历史并显示版本间的差异:git log -p 查看指定历史:git log xxx(sha1值) -p 查看提交历史(指定时间):

  • 2017-02-13 17:50:05

    cURL error 60: SSL certificate problem: unable to get local issuer certificate

    Drupal 8 version uses Guzzle Http Client internally, but under the hood it may use cURL or PHP internals. If you installed PHP cURL on your PHP server it typically uses cURL and you may see an exception with error Peer certificate cannot be authenticated with known CA certificates or error code CURLE_SSL_CACERT (60).