简介
Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配"的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。
FastJson特性
1、提供服务器端、安卓客户端两种解析工具,性能表现较好。
2、提供了toJSONString()和parseObject)方法来将Java 对象与JSON相互转换。调用toJSONString方法即可将对象转换成JSON字符串,parseObject方法则反过来将JSON字符串转换成对象。
3、允许转换预先存在的无法修改的对象(只有class、无源代码)。
4、Java泛型的广泛支持。
5、允许对象的自定义表示、允许自定义序列化类。
6、支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。
下载和使用
链接: Fastjson 源码地址.
链接: Fastjson 中文 Wiki.
你可以在 maven 中央仓库中直接下载:http://repo1.maven.org/maven2/com/alibaba/fastjson/
或者配置 maven 依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
//其中 x.x.x 是版本号,根据需要使用特定版本,建议使用最新版本。
具体使用
序列化将对象/集合转换成JSON字符串
import com.alibaba.fastjson.JSON;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Person {
private int age;
private String name;
private Date birthday;
private List<Person> personList = new ArrayList<Person>();
public void set(int age, String name, Date birthday) {
this.age = age;
this.name = name;
this.birthday = birthday;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Before
public void setUp() {
Calendar instance = Calendar.getInstance();
instance.set(2000, 10, 10, 10, 10, 10);
Person p1 = new Person();
p1.set(20, "Jack", instance.getTime());
instance.set(2001, 1, 9, 10, 12, 10);
Person p2 = new Person();
p2.set(21, "Tom", instance.getTime());
personList.add(p1);
personList.add(p2);
}
@Test
public void ListToJson() {
Calendar instance = Calendar.getInstance();
instance.set(2000, 10, 10, 10, 10, 10);
Person p1 = new Person();
p1.set(20, "Jack", instance.getTime());
String personStr = JSON.toJSONString(p1);
String personListStr = JSON.toJSONString(personList);
System.out.println(personListStr);
System.out.println(personStr);
}
}
结果图
使用toJSONString方法可以将一个集合或者对象转换成JSON字符串
但是日期类型返回的是时间戳
键值对的键都是每一个属性的属性名
JSONField的使用
查看JSONField的源码
package com.alibaba.fastjson.annotation;
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才支持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
注意:JSONField其实是作用在get和set方法上的,所有想要他起作用私有属性必须有set和get方法
如果我们想要改变字段名
@JSONField(name = "AGE")
private int age;
由结果可见,字段名已经不再是属性名了
如果我们想要格式化日期类型的数据
@JSONField(format = "yyyy-MM-dd")
private Date birthday;
日期格式化成功,不再是时间戳
如果我们想改变键值对的顺序
@JSONField(name = "AGE",ordinal = 2)
private int age;
@JSONField(ordinal = 1)
private String name;
@JSONField(format = "yyyy-MM-dd",ordinal = 3)
private Date birthday;
顺序已经改变了
如果有些属性我们不想序列化
@JSONField(name = "AGE",ordinal = 2,serialize = false)
private int age;
age没有序列化
JSONField不仅仅可以只有在field还可以用在set和get方法
@JSONField(name = "NAME")
public String getName() {
return name;
}
@JSONField(name = "NAME")
public void setName(String name) {
this.name = name;
}
键已经被改写
反序列化(将JSON字符串转换成对象或者集合)
转换成对象
Person p3 = JSON.parseObject(personStr, Person.class);
System.out.println(p3);
转换成集合
List<Person>personList = JSON.parseArray(personListStr,Person.class);
System.out.println(personList);
如果不知道是集合还是对象时
Object obj1 = JSON.parse(personStr);
System.out.println(obj1.toString());