zoukankan      html  css  js  c++  java
  • 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 }  
  • 相关阅读:
    应用程序框架实战十三:DDD分层架构之我见
    Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
    Util应用程序框架公共操作类(二):数据类型转换公共操作类(源码篇)
    不能使用 float 和 double 来表示金额等精确的值
    JVM 字节码指令手册
    MyBatis: Invalid bound statement (not found)错误的可能原因
    Oracle:ORA-01219:database not open:queries allowed on fixed tables/views only
    手写 Spring MVC
    8080 端口被占用的解决方法 netstat -ano;taskkill (命令行)
    Java 工具类 IpUtil
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/8358377.html
Copyright © 2011-2022 走看看