com.alibaba.fastjson.JSON详解

目录

  1. 概述
  2. 快速入门
  3. 常用 API
  4. 高级特性
  5. 性能优化
  6. 安全性
  7. 参考资料

概述

com.alibaba.fastjson.JSON 是阿里巴巴开源的一个高性能 JSON 处理库,主要用于 JSON 数据的解析和生成。

fastjson 提供了丰富的 API,用于将 Java 对象与 JSON 字符串之间进行相互转换,并且具有高效、简洁的特点。

快速入门

Maven 依赖

在你的项目中使用 fastjson 之前,需要在 pom.xml 中添加以下依赖:

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version> <!-- 请使用最新版本 -->
</dependency>

基本使用

以下是一个简单的示例,展示如何使用 fastjson 进行 JSON 序列化和反序列化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import com.alibaba.fastjson.JSON;

public class FastJsonExample {
public static void main(String[] args) {
// 创建一个对象
User user = new User("Alice", 30);

// 对象序列化为 JSON 字符串
String jsonString = JSON.toJSONString(user);
System.out.println("JSON 字符串:" + jsonString);

// JSON 字符串反序列化为对象
User deserializedUser = JSON.parseObject(jsonString, User.class);
System.out.println("反序列化对象:" + deserializedUser);
}
}

class User {
private String name;
private int age;

// 构造函数、Getter 和 Setter
public User(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}

常用 API

JSON 序列化

将 Java 对象转换为 JSON 字符串的过程称为序列化。

示例

1
2
3
User user = new User("Alice", 30);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);

自定义序列化

可以使用 SerializeConfigSerializerFeature 来自定义序列化行为。

1
2
3
4
SerializeConfig config = new SerializeConfig();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
String jsonString = JSON.toJSONString(user, config);
System.out.println(jsonString);

JSON 反序列化

将 JSON 字符串转换为 Java 对象的过程称为反序列化。

示例

1
2
3
String jsonString = "{\"name\":\"Alice\",\"age\":30}";
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user);

泛型反序列化

1
2
3
String jsonString = "[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25}]";
List<User> userList = JSON.parseArray(jsonString, User.class);
userList.forEach(System.out::println);

JSONPath

fastjson 支持 JSONPath,可以像 XPath 一样查询 JSON 数据。

示例

1
2
3
4
String jsonString = "{\"name\":\"Alice\",\"age\":30,\"address\":{\"city\":\"Beijing\",\"street\":\"Wangfujing\"}}";
Object document = JSON.parse(jsonString);
String city = JSONPath.eval(document, "$.address.city").toString();
System.out.println(city); // 输出:Beijing

高级特性

自定义序列化和反序列化

自定义序列化

通过实现 ObjectSerializer 接口,可以自定义序列化逻辑。

1
2
3
4
5
6
7
8
9
10
public class UserSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
User user = (User) object;
JSONObject json = new JSONObject();
json.put("name", user.getName());
json.put("age", user.getAge());
serializer.write(json);
}
}

自定义反序列化

通过实现 ObjectDeserializer 接口,可以自定义反序列化逻辑。

1
2
3
4
5
6
7
8
9
public class UserDeserializer implements ObjectDeserializer {
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
JSONObject json = parser.parseObject();
String name = json.getString("name");
int age = json.getIntValue("age");
return (T) new User(name, age);
}
}

注解

fastjson 提供了一些注解,用于自定义序列化和反序列化行为。

  • @JSONField:用于自定义字段的序列化名称、格式等。

示例

1
2
3
4
5
6
7
8
9
public class User {
@JSONField(name = "user_name")
private String name;

@JSONField(format = "yyyy-MM-dd")
private Date birthDate;

// 构造函数、Getter 和 Setter
}

解析复杂 JSON

对于嵌套复杂的 JSON 结构,可以使用 TypeReference 进行反序列化。

示例

1
2
3
4
String jsonString = "{\"data\":{\"name\":\"Alice\",\"age\":30}}";
TypeReference<Map<String, User>> typeRef = new TypeReference<Map<String, User>>() {};
Map<String, User> data = JSON.parseObject(jsonString, typeRef);
System.out.println(data);

性能优化

  • 关闭循环引用检测:在序列化时可以关闭循环引用检测以提升性能。

    1
    String jsonString = JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
  • 序列化大对象:对于大对象的序列化,可以使用流式处理以减少内存消耗。

安全性

  • 避免反序列化漏洞:不要反序列化不可信的 JSON 数据,以防止反序列化漏洞。
  • 配置安全特性:使用 ParserConfig 禁用一些不安全的类。
    1
    ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

参考资料