【Java Web】Fastjson 特性介绍与使用指南

一、前言

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,使得序列化和反序列化变得非常容易。

以下是一个示例:

java 复制代码
String text = JSON.toJSONString(obj); // 序列化
VO vo = JSON.parseObject("{...}", VO.class); // 反序列化

我们可以在maven中央仓库中直接下载:

bash 复制代码
https://repo1.maven.org/maven2/com/alibaba/fastjson/

或者使用 Maven 配置依赖:

xml 复制代码
<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。

java 复制代码
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 字节数组。

java 复制代码
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 字符串,并将其写入 WriterOutputStream

java 复制代码
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。

java 复制代码
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。

java 复制代码
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 方法上
java 复制代码
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 注解被配置在 getIdsetId 方法上,用于指定字段的名称。

  • 方式二:配置在字段上
java 复制代码
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 属性来配置日期字段的格式化方式,对日期格式化非常有用。

java 复制代码
public class A {
    @JSONField(format = "yyyyMMdd")
    public Date date;
}

在上述示例中,@JSONField 注解的 format 属性指定了日期字段 date 的格式为 "yyyyMMdd"。

(3)使用 serialize 和 deserialize 控制字段的序列化和反序列化

@JSONField 注解的 serialize 属性和 deserialize 属性允许您明确控制字段的序列化和反序列化行为。我们可以将它们设置为 false 以禁用序列化或反序列化。

java 复制代码
public class A {
    @JSONField(serialize = false)
    public Date date;
}

在这个示例中,@JSONField 注解的 serialize 属性被设置为 false,因此字段 date 不会被序列化。

(4)使用 ordinal 指定字段的顺序

Fastjson 默认按字段名称的字母序进行序列化。但如果我们需要明确指定字段的序列化顺序,就可以使用 @JSONField 注解的 ordinal 属性。这个特性需要 Fastjson 1.1.42 版本或更高版本。

java 复制代码
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,它允许我们为特定属性指定自定义的序列化类。这可以用于对特定属性进行定制化的序列化。

java 复制代码
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 属性进行特定的序列化操作。

测试代码如下:

java 复制代码
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 的基本用法,希望这对您有所帮助。

相关推荐
【D'accumulation】15 分钟前
典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
java·设计模式·mvc
wn53125 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
试行30 分钟前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe35 分钟前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
救救孩子把40 分钟前
Java基础之IO流
java·开发语言
小菜yh41 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.1 小时前
Java键盘输入语句
java·开发语言
浅念同学1 小时前
算法.图论-并查集上
java·算法·图论
希冀1231 小时前
【操作系统】1.2操作系统的发展与分类
后端
立志成为coding大牛的菜鸟.1 小时前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode