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

277 阅读6分钟

一、前言

Fastjson 是一个强大的 Java 库,它可以将 Java 对象与 JSON 格式之间相互转换。这意味着我们可以轻松地将 Java 对象序列化为 JSON 字符串,或将 JSON 字符串反序列化为 Java 对象。

在本文中,我们将记录 Fastjson 的特性和使用方法。

图片.png

官方地址: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 字符串,并将其写入 WriterOutputStream

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

  • 方式二:配置在字段上
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 的基本用法,希望这对您有所帮助。