淘先锋技术网

首页 1 2 3 4 5 6 7

说到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 }