一、关于Fastjson
1.1 简介
Fastjson 是由阿里巴巴集团开发的一个高性能的 JSON 处理库,它支持 Java 对象与 JSON 字符串之间的互相转换。Fastjson 自 2011 年发布以来,以其卓越的性能和丰富的功能在 Java 社区中获得了广泛的应用。
Alibaba Fastjson: 目前在人类已知范围内,这个星球跑的最快的Java JSON库。在过去的十年里,fastjson v1作为国内github star最多和最受欢迎的json解析库,如今fastjson v2 重磅来袭,性能炸裂。
1.2 发展
初始阶段
- 2010年:FastJSON 的起源可以追溯到 2010 年左右。当时,阿里巴巴的技术专家温绍锦(花名:高铁)在寻找一个高效、易用的 JSON 解析库时发现现有的解决方案并不完全满足需求,于是决定自己动手编写一个。
- 早期版本:最初的 FastJSON 版本是基于一些基本的需求设计的,目标是提供快速且易于使用的 JSON 处理功能。
成长与发展
- 开源与社区支持:随着 FastJSON 的性能和功能逐渐得到认可,阿里巴巴决定将其开源,以便更多开发者能够使用并贡献代码。这标志着 FastJSON 开始走向更广泛的社区支持和发展。
- 版本迭代:FastJSON 经历了多个版本的迭代,每个新版本都会修复已知问题,并引入新的特性和优化。例如,v1.2.x 系列版本中就增加了许多重要的改进和安全特性。
安全性与漏洞
- 安全性问题:尽管 FastJSON 在性能上表现出色,但它也经历了几次严重的安全漏洞事件。特别是在 v1.2.43 及之前的版本中,存在一些潜在的安全风险,如反序列化攻击等。
- 响应与改进:面对这些挑战,FastJSON 团队积极应对,发布了多个补丁和更新来解决已知的安全问题,并增强了整体的安全性。
新一代 FastJSON
- FastJSON 2.0:为了从根本上解决历史遗留的问题,并进一步提升性能和安全性,阿里巴巴推出了 FastJSON 2.0。这个新版本重新设计了架构,提供了更好的兼容性和扩展性,并且更加注重安全性。
- 持续改进:FastJSON 2.0 之后,团队继续致力于提高库的稳定性和性能,同时增加了一些新的功能和优化,以适应不断变化的技术环境。
当前状态
- 广泛采用:FastJSON 已经成为国内外非常流行的 JSON 处理库之一,被大量企业级应用和服务所采用。
- 持续发展:FastJSON 仍在不断发展和完善中,定期发布新的版本以修复 bug、添加新功能和支持最新的 Java 版本。
FASTJSON v2是FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库。通过同一套API支持JSON/JSONB两种协议,JSONPath是一等公民,支持全量解析和部分解析,支持Java服务端、客户端Android、大数据场景。
1.3 特点
- 高性能: FASTJSON 在序列化和反序列化方面表现出色,速度通常比其他 JSON 处理库(如 Jackson 和 Gson)更快。
- 易用性: 提供简单易用的 API,使得 JSON 的处理变得直观,开发者可以轻松地将 Java 对象转化为 JSON 字符串,或从 JSON 字符串中解析出 Java 对象。
- 支持复杂数据结构: 能够处理复杂的数据结构,包括嵌套对象、数组等。
- 灵活的配置: 提供多种特性配置,允许用户根据需求定制序列化和反序列化的行为,比如日期格式、字段过滤等。
- 快速解析: 支持从字符串流或输入流快速解析 JSON 数据,提高了性能和内存使用效率。
1.4 应用场景
- Web开发:常用于RESTful API的JSON数据处理。
- 数据交换:在分布式系统中,作为不同服务之间的数据交换格式。
- 配置文件解析:可以用作应用程序的配置文件格式,方便读取和写入。
二、基本用法
2.1 添加依赖
FastJSON 使用十分方便,只需要在 Maven 工程的 pom 文件中引入以下依赖即可:
v1版本
xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version> <!-- 请根据最新版本更新 -->
</dependency>
v2版本
在fastjson v2
中,groupId
和1.x
不一样,是com.alibaba.fastjson2
:
xml
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.x.x</version>
</dependency>
fastjson v1
的兼容包
如果原来使用fastjson 1.2.x
版本,可以使用兼容包,兼容包不能保证100%兼容,请仔细测试验证,发现问题请及时反馈。
xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.x.x</version>
</dependency>
2.2 序列化(Java对象转JSON字符串)
typescript
import com.alibaba.fastjson.JSON;
public class Example {
public static void main(String[] args) {
User user = new User("Alice", 30);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString); // 输出: {"name":"Alice","age":30}
}
}
class User {
private String name;
private int age;
// 构造函数和getter、setter略
}
2.3 反序列化(JSON字符串转Java对象)
ini
String jsonString = "{"name":"Alice","age":30}";
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user.getName()); // 输出: Alice
三、主要核心类
3.1 JSON类
简介
FastJSON 提供了几个核心类来处理 JSON 数据。在包中可以发现主要的3个类,JSON,JSONArray,JSONObject,三者之间的关系如下,JSONObject和JSONArray继承JSON
JSON类是 Fastjson 中最核心的类,提供了用于 JSON 数据处理的静态方法。
-
常用方法:
toJSON(Object obj)
:将 Java 对象转换为 JSON 对象。toJSONString(Object obj)
:将 Java 对象序列化为 JSON 字符串。parse(String text)
:将 JSON 字符串解析为 JSON 对象。parseObject(String text, Class<T> clazz)
:将 JSON 字符串解析为指定类型的 Java 对象。
toJSONString(Object o)
这个方法平时最常见了,将JavaBean序列化成 JSON 文本
通过传入一个对象,便可以将对象转成 JSON 字符串,这里我们传入的不仅仅是 JavaBean 还可以是一个 Map 对象
传入一个 Map 对象 我们同样可以获取到一个 JSON 字符串。List 对象也很适用:
结果是一个标准的 JSONArray 的字符串
parseArray(String text)
这是一个将 JSON字符串 转为 JSONArray 的方法
parseObject(String text)
上面说到的是 序列化 ,那么对应的便是 反序列化
反序列化就是把JSON格式的字符串转化为Java Bean对象。
用法十分简单,可以将一个标准的 JSON 字符串 转为一个 JSONObject 对象 ,由于 JSONObject 类 实现了 Map 接口 ,因此我们可以通过 get()
来获取到值。
我们已经知道了 Map 的致命不足,所以我们更希望能得到一个 JavaBean 对象。
当然也是可以的!我们通过传入我们想要转换的对象类型,就可以得到我们想要的 JavaBean
3.2 JSONArray类
简介
JSONArray
是 Fastjson 库中用于表示 JSON 数组的类。它提供了多种方法来操作和管理 JSON 数组的数据。
-
常用方法:
add(Object value)
:向数组中添加一个元素。get(int index)
:获取指定索引位置的元素。size()
:返回数组的长度。toJSONString()
:将JSONArray
转换为 JSON 字符串。toArray(Class<T> componentType)
:将JSONArray
转换为指定类型的 Java 数组。toList(Class<T> clazz)
:将JSONArray
转换为指定类型的 Java 列表。
1. 创建 JSONArray
typescript
import com.alibaba.fastjson.JSONArray;
public class JSONArrayExample {
public static void main(String[] args) {
// 创建一个空的 JSONArray
JSONArray jsonArray = new JSONArray();
// 添加元素
jsonArray.add("Hello");
jsonArray.add(123);
jsonArray.add(true);
System.out.println(jsonArray); // 输出: ["Hello",123,true]
}
}
2. 从 JSON 字符串解析 JSONArray
typescript
import com.alibaba.fastjson.JSONArray;
public class ParseJSONArrayExample {
public static void main(String[] args) {
// 从 JSON 字符串解析 JSONArray
String jsonString = "["Apple", "Banana", "Cherry"]";
JSONArray jsonArray = JSONArray.parseArray(jsonString);
System.out.println(jsonArray); // 输出: ["Apple","Banana","Cherry"]
}
}
3. 访问 JSONArray 中的元素
typescript
import com.alibaba.fastjson.JSONArray;
public class AccessJSONArrayExample {
public static void main(String[] args) {
String jsonString = "["Apple", "Banana", "Cherry"]";
JSONArray jsonArray = JSONArray.parseArray(jsonString);
// 获取元素
String firstElement = jsonArray.getString(0); // "Apple"
String secondElement = jsonArray.getString(1); // "Banana"
System.out.println(firstElement); // 输出: Apple
System.out.println(secondElement); // 输出: Banana
}
}
4. 遍历 JSONArray
typescript
import com.alibaba.fastjson.JSONArray;
public class IterateJSONArrayExample {
public static void main(String[] args) {
String jsonString = "["Apple", "Banana", "Cherry"]";
JSONArray jsonArray = JSONArray.parseArray(jsonString);
// 遍历 JSONArray
for (int i = 0; i < jsonArray.size(); i++) {
System.out.println(jsonArray.getString(i));
}
// 输出:
// Apple
// Banana
// Cherry
}
}
5. 修改 JSONArray 中的元素
typescript
import com.alibaba.fastjson.JSONArray;
public class ModifyJSONArrayExample {
public static void main(String[] args) {
String jsonString = "["Apple", "Banana", "Cherry"]";
JSONArray jsonArray = JSONArray.parseArray(jsonString);
// 修改元素
jsonArray.set(1, "Blueberry"); // 将 "Banana" 修改为 "Blueberry"
System.out.println(jsonArray); // 输出: ["Apple","Blueberry","Cherry"]
}
}
6. 删除 JSONArray 中的元素
typescript
import com.alibaba.fastjson.JSONArray;
public class RemoveFromJSONArrayExample {
public static void main(String[] args) {
String jsonString = "["Apple", "Banana", "Cherry"]";
JSONArray jsonArray = JSONArray.parseArray(jsonString);
// 删除元素
jsonArray.remove(1); // 删除 "Banana"
System.out.println(jsonArray); // 输出: ["Apple","Cherry"]
}
}
3.3 JSONObject类
简介
JSONObject类实现了Map接口,代表了一个JSON对象。它允许你通过键值对的方式存储和检索。
-
常用方法:
get(String key)
:获取指定键的值。put(String key, Object value)
:添加或替换指定键的值。getString(String key)
、getIntValue(String key)
等:获取特定类型的值。fluentPut(String key, Object value)
:链式调用的方式添加键值对。toJSONString()
:将JSONObject
转换为 JSON 字符串。
1. 构造方法
-
JSONObject()
: 创建一个空的 JSON 对象。 -
JSONObject(Map<?, ?> map)
: 根据给定的映射创建 JSON 对象。
2. 添加和设置键值对
-
put(String key, Object value)
: 添加或更新键值对。javascriptJSONObject jsonObject = new JSONObject(); jsonObject.put("name", "Alice"); jsonObject.put("age", 30);
-
putAll(Map<? extends String, ?> map)
: 将一个映射中的所有键值对添加到 JSON 对象中。arduinoMap<String, Object> map = new HashMap<>(); map.put("city", "Beijing"); map.put("country", "China"); jsonObject.putAll(map);
3. 获取值
-
get(String key)
: 根据键获取对应的值。iniObject name = jsonObject.get("name");
-
getString(String key)
: 根据键获取字符串类型的值。iniString name = jsonObject.getString("name");
-
getInteger(String key)
: 根据键获取整数类型的值。iniInteger age = jsonObject.getInteger("age");
-
getJSONObject(String key)
: 根据键获取 JSON 对象。iniJSONObject address = jsonObject.getJSONObject("address");
-
getJSONArray(String key)
: 根据键获取 JSON 数组。iniJSONArray hobbies = jsonObject.getJSONArray("hobbies");
4. 删除键值对
-
remove(String key)
: 删除指定键的键值对。csharpjsonObject.remove("city");
-
clear()
: 清空 JSON 对象中的所有键值对。inijsonObject.clear();
5. 查询方法
-
containsKey(String key)
: 检查 JSON 对象中是否包含指定的键。iniboolean hasName = jsonObject.containsKey("name");
-
size()
: 返回 JSON 对象中键值对的数量。iniint size = jsonObject.size();
6. 转换
-
toJSONString()
: 将 JSON 对象转换为 JSON 字符串。iniString jsonString = jsonObject.toJSONString();
-
toJavaObject(Class<T> clazz)
: 将 JSON 对象转换为 Java 对象。iniPerson person = jsonObject.toJavaObject(Person.class);
7. 其他方法
-
keySet()
: 返回 JSON 对象中所有键的集合。iniSet<String> keys = jsonObject.keySet();
-
clone()
: 克隆一个新的JSONObject
。iniJSONObject clonedObject = jsonObject.clone();
示例
typescript
import com.alibaba.fastjson.JSONObject;
public class FastjsonExample {
public static void main(String[] args) {
// 创建一个 JSON 对象
JSONObject jsonObject = new JSONObject();
// 添加键值对
jsonObject.put("name", "Alice");
jsonObject.put("age", 30);
jsonObject.put("city", "Beijing");
// 打印 JSON 对象
System.out.println("JSON Object: " + jsonObject.toJSONString());
// 访问值
String name = jsonObject.getString("name");
Integer age = jsonObject.getInteger("age");
System.out.println("Name: " + name);
System.out.println("Age: " + age);
// 修改值
jsonObject.put("age", 31);
System.out.println("Updated JSON Object: " + jsonObject.toJSONString());
// 删除键值对
jsonObject.remove("city");
System.out.println("After removal: " + jsonObject.toJSONString());
// 查询大小
System.out.println("Size of object: " + jsonObject.size());
}
}