一篇文章带你入门Fastjson2:Java库的“闪电”解析
介绍一个Java编程中非常实用的库——Fastjson2。
Fastjson2是一个由我国阿里巴巴团队开发的高效JSON解析库,它能够让你在处理JSON数据时,体验到飞一般的感觉。
1、Fastjson2的背景
在互联网开发领域,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。
由于其简洁易读的特点,JSON成为了网络数据传输的事实标准。
当时在Java中处理JSON数据并不总是那么容易。为此Fastjson应运而生,它旨在简化Java开发者处理JSON数据的复杂度,提高处理速度。
Fastjson2是Fastjson项目的重要升级,与Fastjson1相比,性能有非常大的提升。
性能远超过其他流行JSON库,包括jackson/gson/org.json,
性能数据: https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark
2、Fastjson2的特点
- 速度快:Fastjson2的解析速度非常快,比其他库如Jackson和Gson要快得多。
- 易使用:Fastjson2的API简单易用,你几乎可以无脑使用它。
- 功能全:Fastjson2支持各种复杂类型的JSON处理,包括泛型、枚举等。
- 可扩展:Fastjson2允许你自定义序列化和反序列化规则。
- 支持JDK新特性
- 完善的JSONPath支持,支持SQL:2016的JSONPath语法
- 支持Android 8+,客户端和服务器一套API
- 支持JSON Schema
3、Fastjson2的使用
1.添加依赖,在你的项目中添加Fastjson2的依赖。如果你使用Maven,可以在pom.xml文件中添加以下代码:
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.44</version>
</dependency>
2.JSON字符串转Java对象
public class Test1 {
public static void main(String[] args) {
// 一个简单的JSON字符串
String jsonStr = "{\"name\":\"张三\",\"age\":30}";
// 使用Fastjson2将JSON字符串转换为Java对象
Person person = JSON.parseObject(jsonStr, Person.class);
// 输出转换后的对象信息
System.out.println(person.getName());
System.out.println(person.getAge());
}
}
class Person {
private String name;
private Integer age;
// getter和setter方法
}
3.Java对象转JSON字符串
public class Test2 {
public static void main(String[] args) {
// 创建一个Java对象
Person person = new Person();
person.setName("李四");
person.setAge(25);
// 使用Fastjson2将Java对象转换为JSON字符串
String jsonStr = JSON.toJSONString(person);
// 输出转换后的JSON字符串
System.out.println(jsonStr);
}
}
class Person {
private String name;
private Integer age;
// getter和setter方法
}
4.将JSON解析为JSONObject
public class Test3 {
public static void main(String[] args) {
// 一个包含复杂类型的JSON字符串
String jsonStr = "{\"name\":\"张三\",\"age\":30}";
// 使用Fastjson2将JSON字符串解析为JSONObject
JSONObject jsonObject = JSON.parseObject(jsonStr);
}
}
5.将JSON解析为JSONArray
public class Test4 {
public static void main(String[] args) {
String text = "[30, \"age\"]";
// 使用Fastjson2将JSON字符串转换为JSONArray
JSONArray array = JSON.parseArray(text);
int ageVal = array.getIntValue(0);
String age = array.getString(1);
}
}
6.将Java对象序列化JSONB / JSONB数据解析为Java对象
public class Test5 {
public static void main(String[] args) {
// 创建一个Java对象
Person person = new Person();
person.setName("张三");
person.setAge(30);
// 将Java对象序列化为JSONB
byte[] bytes = JSONB.toBytes(user);
byte[] bytes = JSONB.toBytes(user, JSONWriter.Feature.BeanToArray);
//将JSONB数据解析为JavaBean
User user = JSONB.parseObject(bytes, Person.class);
User user = JSONB.parseObject(bytes, Person.class, JSONReader.Feature.SupportBeanArrayMapping);
}
}
7.使用JSONPath
public class Test6 {
public static void main(String[] args) {
String jsonStr = "{'store':{'book':[" +
"{'category':'1','author':'王','title':'test1','price':8}," +
"{'category':'2','author':'李','title':'test2','price':12}]," +
"'bicycle':{'color':'red','price':10}}}";
JSONPath path = JSONPath.of("$..author"); // 缓存起来重复使用能提升性能
// 使用JSONPath读取部分数据
JSONReader parser1 = JSONReader.of(jsonStr);
Object result1 = path.extract(parser1);
System.out.println("所有author节点:" + result1);
byte[] bytes = jsonStr.getBytes();
//使用JSONPath读取部分byte[]的数据
JSONReader parser2 = JSONReader.of(bytes);
Object result2 = path.extract(parser2);
System.out.println("所有author节点:" + result2);
}
}
4、处理复杂类型
Fastjson2不仅能够处理简单的JSON数据,还能够轻松应对复杂类型,如泛型、枚举、嵌套对象等。
1.泛型处理
import com.alibaba.fastjson2.JSON;
public class Test7 {
public static void main(String[] args) {
// 一个包含泛型的JSON字符串
String jsonStr = "{\"list\":[{\"name\":\"张三\",\"age\":30},{\"name\":\"李四\",\"age\":25}]}";
// 使用Fastjson2将JSON字符串转换为Java对象,其中包含泛型
GenericList<Person> genericList = JSON.parseObject(jsonStr, GenericList.class);
// 输出转换后的对象信息
for (Person person : genericList) {
System.out.println(person.getName());
System.out.println(person.getAge());
}
}
}
class Person {
private String name;
private Integer age;
// getter和setter方法
}
class GenericList<T> {
private List<T> list;
// getter和setter方法
}
2.枚举处理
import com.alibaba.fastjson2.JSON;
public class Test8 {
public static void main(String[] args) {
// 一个包含枚举的JSON字符串
String jsonStr = "{\"status\":\"启用\"}";
// 使用Fastjson2将JSON字符串转换为Java对象,其中包含枚举
EnumStatus enumStatus = JSON.parseObject(jsonStr, EnumStatus.class);
// 输出转换后的对象信息
System.out.println(enumStatus);
}
}
enum EnumStatus {
启用,禁用
}
3.自定义序列化和反序列化
public class Test1 {
public static void main(String[] args) {
Person person = new Person("王五",20);
// 序列化对象
String jsonStr = JSON.toJSONString(person);
System.out.println(jsonStr);
//反序列化对象
Person person1 = JSON.parseObject(jsonStr, Person.class);
System.out.println(person1);
}
}
@Data
class Person implements Serializable {
private String name;
@JSONField(writeUsing = IntegerObjectWriter.class, deserializeUsing=IntegerObjectReader.class)
private Integer age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter和setter方法
}
// 自定义序列化规则
class IntegerObjectWriter implements ObjectWriter<Integer> {
@Override
public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
System.out.println("写-进来过");
//简单的将Integer类型转成字符串
if (object instanceof Integer) {
jsonWriter.writeString(object.toString());
} else {
jsonWriter.writeAny(object);
}
}
}
// 自定义反序列化规则
class IntegerObjectReader implements ObjectReader<Integer> {
@Override
public Integer readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
System.out.println("读-进来过");
return jsonReader.readInt32();
}
}
▽
Fastjson2的口号是——“JSON处理,唯快不破”。
Fastjson2是一个功能强大、易于使用且高效的JSON处理库。
无论是处理简单的JSON数据,还是应对复杂的类型和场景,Fastjson2都能够提供良好的支持。
通过自定义序列化和反序列化规则,Fastjson2还能够满足你个性化的需求。
安全性方面,Fastjson2提供了安全模式和非安全模式,让你在性能和安全性之间做出权衡。
这篇文章希望能够帮助你更好地理解和掌握Fastjson2的使用。