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

https://jisonami.iteye.com/blog/2299952

https://www.jianshu.com/p/a03bc97875b8

 

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

但其实若是用于数据传输,xml和json两种数据格式用得更多一些。我在第一家公司上班是也曾经自己封装过Java对象与xml相互转换的工具,你可能会说为什么不用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 
 

Xml代码 

 收藏代码

  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 

Java代码 

 收藏代码

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


 

Java代码 

 收藏代码

  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对象的序列化与反序列化 

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对象的序列化与反序列化 

Java代码 

 收藏代码

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



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

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类库的完整代码如下: 

Java代码 

 收藏代码

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

0 

原文链接:Gson - Getting Started with Java-JSON Serialization & Deserialization
原文出自:Norman Peitek
译者:無名無

今天开始学习 Google 的 Gson 库,Gson 是一个非常强大的库,可以将 JSON 格式的数据转化成 Java 对象,也支持将 Java 对象转成 JSON 数据格式。

Gson 依赖

本文将会快速开始使用 Gson 进行序列化操作。由于很多读者都是 Android 开发人员,我们会提供 Java 环境中的 Gson。在开始之前,我们需要引入 Gson 库到自己的项目中,最新的版本是 2.8.0.

Gradle 项目添加

compile 'com.google.code.gson:gson:2.8.0'

Maven 项目添加

<dependencies>
    <dependency>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
      <version>2.8.0</version>
       <scope>compile</scope>
    </dependency>
</dependencies>

使用 JAR

也支持导入 JAR 包使用(Eclipse、AS都可以),下载导入即可,地址: the official GitHub repository

Java-JSON 序列化基础

先来看一些序列化例子,Gson 中的序列化意味着将 Java 对象映射成 JSON 数据格式,在接下来的教程中,我们会逐步介绍一些更复杂的情况,首先来看一个简单的例子:

public class UserSimple {
    String name;
    String email;
    int age;
    boolean isDeveloper;
}

UserSimple 对象有四个变量:

  • 字符串类型的 name
  • 字符串类型的 email
  • 整型的 age(例如:26)
  • 布尔类型的 isDeveloper(true or false)

Android 或 Java 应用程序需要将 UserSimple 对象转换为 JSON 表示,我们期望是这样的格式:

{
    "name": "Norman",
    "email": "norman@futurestud.io",
    "age": 26,
    "isDeveloper": true
}

来看下我们是如何用 Gson 转化的,首先要创建一个对象:

UserSimple userObject = new UserSimple(
    "Norman",
    "norman@futurestud.io",
    26,
    true
);

需要用到 Gson 对象,使用以下构造函数来生成 Gson 对象:

Gson gson = new Gson();

使用 Gson 的 torsion() 方法并传入 UserSimple 对象作为参数:

String userJson = gson.toJson(userObject); 

输出JSON格式数据

{
    "age": 26,
    "email": "norman@futurestud.io",
    "isDeveloper": true,
    "name": "Norman"
}

可以看到,Gson 改变了变量的顺序(按字母顺序),但是内容没变。Gson 中字符串被包装成"",整型没有被包装,我们没有必要弄乱 JSON 对象或者复制单个成员,对于单个对象映射使用 Gson 已经足够了。也能满足一些复杂的数据结构。在深入了解之前,我们先看一下另一个案例,我们是否可以将 JSON 格式映射成 Java 对象?

Java-JSON 反序列化基础

String userJson = "{'age':26,'email':'norman@futurestud.io','isDeveloper':true,'name':'Norman'}";

记住在使用的时候将 '替换成",并且创建一个Gson对象:

Gson gson = new Gson();

最后,我们通过 fromJson() 方法将JSON映射成一个 Java 对象:

UserSimple userObject = gson.fromJson(userJson, UserSimple.class);

注意第二个参数的传递,否则,Gson 不知道将 JSON 转换成什么类型。

Debug:

User Object

下一步 & 目标

本文介绍了 Gson 的基本用法,展示了序列化和反序列化的基本用法和示例,以下是一些可能的问题:

  • Java model 类是否需要一个构造函数/ getter / setter?
  • Java model 字段是否可以私有的?
  • 如何处理null值?
  • 如果 Java 类和 JSON 数据数量不一致,该怎么办?
  • 如何序列化和反序列化数组和List
  • 如何序列化和反序列化嵌套的对象
  • Gson 在执行.fromJson() 时是否为类属性保留了一个定义的默认值,如果 JSON 中没有该字段的值,将怎么处理?

不用担心,接下来我们会解决这些问题,你可以通过评论或 twitter @futurestud_io 反馈你的问题。

练习代码已上传 Github https://github.com/whiskeyfei/Gson-Review 可自行查看。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值