一、前言
Fastjson 是一个强大的 Java 库,它可以将 Java 对象与 JSON 格式之间相互转换。这意味着我们可以轻松地将 Java 对象序列化为 JSON 字符串,或将 JSON 字符串反序列化为 Java 对象。
在本文中,我们将记录 Fastjson 的特性和使用方法。
官方地址:alibaba/fastjson (github.com)
二、内容
2.1 概述
Fastjson 是阿里巴巴开源的 JSON 解析库,它提供了高性能、简单易用的 JSON 处理功能。它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Fastjson 具有以下主要功能:
- 序列化:将 Java 对象转换为 JSON 格式的字符串。
- 反序列化:将 JSON 字符串解析为 Java 对象。
- 支持泛型、枚举等高级功能。
- 速度快、性能卓越。
Fastjson 提供了简洁的 API,使得序列化和反序列化变得非常容易。
以下是一个示例:
String text = JSON.toJSONString(obj); // 序列化
VO vo = JSON.parseObject("{...}", VO.class); // 反序列化
我们可以在maven中央仓库中直接下载:
https://repo1.maven.org/maven2/com/alibaba/fastjson/
或者使用 Maven 配置依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.31</version>
</dependency>
JSON 这个类是 Fastjson API 的入口,主要的功能都通过这个类提供。
2.2 JSON 序列化
JSON 序列化是将 Java 对象转换为 JSON 格式的字符串的过程。
Fastjson 提供了多种方法来实现序列化。
(1)toJSONString
首先是 JSON.toJSONString
方法,该方法可以将 Java 对象序列化为 JSON 字符串。它支持各种 Java 基本类型和 JavaBean。
import com.alibaba.fastjson.JSON;
// 创建一个 Java 对象
Model model = new Model();
model.setName("John");
model.setAge(30);
// 将 Java 对象序列化为 JSON 字符串
String jsonString = JSON.toJSONString(model);
System.out.println(jsonString);
在上面的示例中,我们创建了一个名为 Model
的 Java 对象,然后使用 JSON.toJSONString
将其序列化为 JSON 字符串。结果将打印出 JSON 字符串。
(2)toJSONBytes
另一种方法,我们可以使用JSON.toJSONBytes
方法。该方法与 toJSONString
方法类似,但它返回 JSON 字符串的 UTF-8
字节数组。
import com.alibaba.fastjson.JSON;
Model model = new Model();
model.setName("John");
model.setAge(30);
byte[] jsonBytes = JSON.toJSONBytes(model);
System.out.println(new String(jsonBytes, StandardCharsets.UTF_8));
这里,我们使用 JSON.toJSONBytes
将 Java 对象序列化为 JSON 字符串的字节数组,并将其以 UTF-8 编码输出。
(3)writeJSONString
JSON.writeJSONString
方法允许将 Java 对象序列化为 JSON 字符串,并将其写入 Writer
或 OutputStream
。
import com.alibaba.fastjson.JSON;
Model model = new Model();
model.setName("John");
model.setAge(30);
try (Writer writer = new FileWriter("output.json")) {
JSON.writeJSONString(writer, model);
}
在这个示例中,我们使用 JSON.writeJSONString
将 Java 对象序列化为 JSON 字符串,并将其写入一个文件中。你可以使用 OutputStream
来写入字节数组。
2.3 JSON 反序列化
JSON 反序列化是将 JSON 字符串解析为 Java 对象的过程。Fastjson 提供了多种方法来实现反序列化。
(1)parseObject
JSON.parseObject
方法可以将 JSON 字符串反序列化为指定类型的 JavaBean。
import com.alibaba.fastjson.JSON;
String jsonStr = "{\"name\":\"John\",\"age\":30}";
// 将 JSON 字符串反序列化为 Model 类型的 JavaBean
Model model = JSON.parseObject(jsonStr, Model.class);
System.out.println(model.getName());
在上面的示例中,我们使用 JSON.parseObject
方法将 JSON 字符串反序列化为 Model
类型的 JavaBean。
(2)使用泛型类型
Fastjson 还支持将 JSON 字符串反序列化为泛型类型的 JavaBean。
import com.alibaba.fastjson.JSON;
String jsonStr = "[{\"name\":\"John\",\"age\":30},{\"name\":\"Alice\",\"age\":25}]";
// 将 JSON 字符串反序列化为 List<Model> 类型的 JavaBean
Type type = new TypeReference<List<Model>>() {}.getType();
List<Model> list = JSON.parseObject(jsonStr, type);
for (Model model : list) {
System.out.println(model.getName());
}
在这个示例中,我们使用 TypeReference
来定义泛型类型,然后将 JSON 字符串反序列化为 List<Model>
类型的 JavaBean。
2.4 JSONField
Fastjson 提供了 @JSONField
注解,它用于配置 JSON 对象的序列化和反序列化行为。下面我们来看看@JSONField
注解的不同配置方式和用法。
@JSONField
注解用于控制 JSON 对象的序列化和反序列化。通过该注解,我们可以指定字段的名称、格式、是否序列化、是否反序列化等属性。请注意,如果属性是私有的,必须提供相应的set*
方法,否则无法进行反序列化。
(1)配置方式
@JSONField
注解可以配置在字段的 getter 或 setter 方法上,或者直接配置在字段上。
下面是两种配置方式的示例:
- 方式一:配置在 getter 和 setter 方法上
public class A {
private int id;
@JSONField(name = "ID")
public int getId() {
return id;
}
@JSONField(name = "ID")
public void setId(int value) {
this.id = value;
}
}
在上面的示例中,@JSONField
注解被配置在 getId
和 setId
方法上,用于指定字段的名称。
- 方式二:配置在字段上
public class A {
@JSONField(name = "ID")
private int id;
public int getId() {
return id;
}
public void setId(int value) {
this.id = value;
}
}
在这个示例中,@JSONField
注解被配置在字段 id
上,同样用于指定字段的名称。
(2)使用 format 配置日期格式化
我们可以使用 @JSONField
注解的 format
属性来配置日期字段的格式化方式,对日期格式化非常有用。
public class A {
@JSONField(format = "yyyyMMdd")
public Date date;
}
在上述示例中,@JSONField
注解的 format
属性指定了日期字段 date
的格式为 "yyyyMMdd"。
(3)使用 serialize 和 deserialize 控制字段的序列化和反序列化
@JSONField
注解的 serialize
属性和 deserialize
属性允许您明确控制字段的序列化和反序列化行为。我们可以将它们设置为 false
以禁用序列化或反序列化。
public class A {
@JSONField(serialize = false)
public Date date;
}
在这个示例中,@JSONField
注解的 serialize
属性被设置为 false
,因此字段 date
不会被序列化。
(4)使用 ordinal 指定字段的顺序
Fastjson 默认按字段名称的字母序进行序列化。但如果我们需要明确指定字段的序列化顺序,就可以使用 @JSONField
注解的 ordinal
属性。这个特性需要 Fastjson 1.1.42 版本或更高版本。
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
在这个示例中,@JSONField
注解的 ordinal
属性被用于明确指定字段的序列化顺序。
(5)使用 serializeUsing 定制属性的序列化
从 Fastjson 1.2.16 版本开始,@JSONField
注解支持新的配置项 serializeUsing
,它允许我们为特定属性指定自定义的序列化类。这可以用于对特定属性进行定制化的序列化。
public static class Model {
@JSONField(serializeUsing = ModelValueSerializer.class)
public int value;
}
public static class ModelValueSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
Integer value = (Integer) object;
String text = value + "元";
serializer.write(text);
}
}
在上述示例中,我们使用 @JSONField
注解的 serializeUsing
属性指定了一个自定义的序列化类 ModelValueSerializer
,用于对 value
属性进行特定的序列化操作。
测试代码如下:
Model model = new Model();
model.value = 100;
String json = JSON.toJSONString(model);
Assert.assertEquals("{\"value\":\"100元\"}", json);
在此示例中,我们创建了一个 Model
对象,并通过 Fastjson 序列化它,使用了我们自定义的序列化类 ModelValueSerializer
,最终生成了 JSON 字符串({"value":"100元"}
)。
三、总结
Fastjson 是一个强大且性能卓越的 Java 库,用于实现 Java 对象与 JSON 格式之间的转换。它具有丰富的功能和灵活的配置选项,可适应不同的业务需求。无论是将 Java 对象序列化为 JSON 字符串,还是将 JSON 字符串反序列化为 Java 对象,Fastjson 都是一个强大的工具。
通过本文,我们已经了解了 Fastjson 的基本用法,希望这对您有所帮助。