阿里FastJson的使用
标签(空格分隔): java FastJson 序列化
一、什么是FastJson
fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。
二、FastJson的简单入门
1. 添加FastJson的依赖到项目中
1.1 通过Maven来获取依赖FastJson。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version> ${version}</version>
</dependency>
其中${version}替换为相应版本就可以了。目前最新的版本是1.2.39。
2. fastjson的主要API接口方法。
在fastjson API中,最核心的类就是com.alibaba.fastjson.JSON这个类,里面包含了许多大部分开发使用场景下常用的java bean或者map的序列化、反序列化的方法。其中最常用的就是toJSONString和parseObject()这两个序列化和反序列化方法。
package com.alibaba.fastjson;
public abstract class JSON {
public static final String toJSONString(Object object);
public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
}
序列化
String jsonString = JSON.toJSONString(obj);
反序列化:
VO vo = JSON.parseObject("...", VO.class);
泛型反序列化:
import com.alibaba.fastjson.TypeReference;
List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});
3. 一个简单的完整实例
3.1 定义一个Java 实体类User,然后定义一个Vo类代表一个数据传输bean.
User.java
//只列出核心代码
public class User {
private Long id;
private String name;
private Date birthday;
public User(){}
public User(Long id,String name){
this.id=id;
this.name=name;
this.birthday= DateUtils.getCurrentDate();//2017-11-01
System.out.println(birthday.getTime());
}
、、、、、、省略getter、setter,toString方法
}
Vo.java
public class Vo {
private Long id;
private List<User> userList;
private Map<String,Object> data;
public Vo(){}
public Vo(Long id){
this.id=id;
}
、、、、、、省略getter、setter,toString方法
}
3.2 通过TestNg进行测试
@Test
public void testFastJsonSerializeAndDeserialize(){
User user1=new User(1L,"licho");
List<User> userList=new ArrayList<>();
userList.add(user1);
Map<String,Object> data=new HashMap<>();
User user2=new User(1L,"licho");
data.put("user",user2);
Vo resultData=new Vo(2L);
resultData.setUserList(userList);
resultData.setData(data);
String str=JSON.toJSONString(resultData);//序列化结果
System.out.println(str);
Vo deserialize=JSON.parseObject(str,Vo.class);//反序列化结果
System.out.println(deserialize);
}
测试结果如下:
{"data":{"user":{"birthday":1509465600000,"id":1,"name":"licho"}},"id":2,"userList":[{"birthday":1509465600000,"id":1,"name":"licho"}]}
Vo{id=2, userList=[User{id=1, name='licho', birthday=Wed Nov 01 00:00:00 GMT+08:00 2017}], data={user={"birthday":1509465600000,"name":"licho","id":1}}}
由结果可以看出,fastjson序列化后的字符串是符合Json规范的。对于属性名即key,都通过双引号包裹,对于布尔以及数字类型序列化value值是不加双引号的,对于集合类型例如List,Set是序列化为array类型,即[]代表一个集合列表,对于Object类型是获取其符合Java Bean规范的属性键和值。字符串类型同样使用双引号包裹。
但是不知道大家有没有发现,对于Date这个我们经常使用的日期类型的序列化,它序列化后的结果是一个数字类型,这个值也就是从1970 年 1 月 1 日开始计算到Date对象所表示时间经过的毫秒数。但是这显然不是我们希望看到的结果,我们想要的应该是经过格式化的时间结果。下面我们就来看看Fastjson日期对象的处理。
三、FastJson对日期类型的处理
1. 序列化时控制Date类型的输出格式
直接指定pattern日期格式
JSON.toJSONStringWithDateFormat(resultDate, "yyyy-MM-dd HH:mm:ss.SSS")
使用ISO-8601日期格式
JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);
全局修改日期格式,这个DEFAULT_DATE_FORMAT变量是JSON.toJsonString(obj,SerializerFeature)方法对于Date类型的对象的默认序列化格式。我们可以通过改变这个变量值来指定date类型的序列化格式。
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);