说到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
<!-- json -->
<!-- 引入fastjson依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.12</version>
</dependency>
二、需要序列化的POJO和初始化代码
package test;
public class User {
private int id;
private String phone;
public int getId(){
return id;
}
public String getPhone(){
return phone;
}
public void setId(int id){
this.id = id;
}
public void setPhone(String phone){
this.phone = phone;
}
}
package test;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Person implements Serializable {
/**
* 序列化ID
*/
private static final long serialVersionUID = -5809782578272943999L;
private String name;
private int age;
private List<User> users = new ArrayList<User>();
//该属性为不可序列化的,所以声明为短暂的
public transient int ssn;
public String getName(){
return name;
}
public int getAge(){
return age;
}
public int getSsn(){
return ssn;
}
public List<User> getUsers(){
return users;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public void setSsn(int ssn){
this.ssn = ssn;
}
public void setUsers( List<User> users){
this.users.addAll(users);
}
}
三、fastjson的使用
fastjson的主要工具类是JSON,以下代码实现Java对象的序列化与反序列化
package test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Reporter;
import org.testng.annotations.Test;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Case3 {
@Test
public void case3(){
User user1 = new User();
user1.setId(1);
user1.setPhone("15050276350");
User user2 = new User();
user2.setId(2);
user2.setPhone("15050276351");
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
Person person = new Person();
person.setName("张三");
person.setAge(18);
// person.getUsers().add(user1);
// person.getUsers().add(user2);
person.setUsers(userList);
//将Java对象序列化为Json字符串
String jsonString = JSON.toJSONString(person);
System.out.println("jsonString:" + jsonString);
//将Json字符串序列化为JSON对象
JSONObject person1 = JSON.parseObject(jsonString);
System.out.println("person1:" + person1);
//将Json字符串反序列化为java对象
Person person2 =JSON.parseObject(jsonString,Person.class);
System.out.println("person2:" + person2);
}
}