说到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
2
3
4 com.alibaba
5 fastjson
6 1.2.12
7
8
9
10
11 com.fasterxml.jackson.core
12 jackson-core
13 2.7.4
14
15
16
17 com.fasterxml.jackson.core
18 jackson-annotations
19 2.7.4
20
21
22
23 com.fasterxml.jackson.core
24 jackson-databind
25 2.7.4
26
27
28
29 com.google.code.gson
30 gson
31 2.6.2
32
二、需要序列化的POJO和初始化代码
以下3种类库的使用均使用下面这个POJO
1 public classUser {2 publicUser(){}3 privateString id;4 privateString name;5 privateString password;6 publicString getId() {7 returnid;8 }9 public voidsetId(String id) {10 this.id =id;11 }12 publicString getName() {13 returnname;14 }15 public voidsetName(String name) {16 this.name =name;17 }18 publicString getPassword() {19 returnpassword;20 }21 public voidsetPassword(String password) {22 this.password =password;23 }24 @Override25 publicString toString() {26 return "User [id=" + id + ", name=" + name + ", password=" +password27 + "]";28 }29 }
1
5 private staticUser initUser(){6 User user = newUser();7 user.setId("1");8 user.setName("jison");9 user.setPassword("jison");10 returnuser;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 = newObjectMapper();//将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 = newGsonBuilder().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 classJsonUtils {2
3
7 private staticUser initUser(){8 User user = newUser();9 user.setId("1");10 user.setName("jison");11 user.setPassword("jison");12 returnuser;13 }14
15 public static voidmain(String[] args) throws Exception {16 //fastjson用法
17 fastjson();18 //jackson用法
19 jackson();20 //gson用法
21 gson();22 }23
24 private static voidfastjson(){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 voidjackson() throws Exception{34 ObjectMapper objectMapper = newObjectMapper();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 voidgson(){44 Gson gson = newGsonBuilder().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 }