FastJson详解 与 使用
7.1 JSON.toJSONString(Object object)
7.2 JSON.parseObject(String text, Class clazz)
7.3 JSON.parseArray(String text, Class clazz)
7.4 JSON.toJavaObject(JSONObject jsonObject, Class clazz)
🎈边走、边悟🎈迟早会好 |
Fastjson
是阿里巴巴开源的一个高性能 Java JSON 处理库,广泛应用于 Java 开发中。它提供了序列化(将 Java 对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为 Java 对象)的功能。与其他 JSON 处理库相比,Fastjson
以其速度快、使用简单、功能强大而著称。
1. Fastjson 的主要功能
- 序列化和反序列化:将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为 Java 对象。
- 支持泛型:能够处理泛型数据类型的序列化和反序列化。
- JSONPath 支持:类似于 XPath 的语法,可以方便地查询 JSON 数据。
- 注解支持:支持通过注解自定义序列化和反序列化行为。
2. 快速开始
要使用 Fastjson
,首先需要在项目中添加 Maven 依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
2.1 对象与 JSON 字符串的转换
序列化:将 Java 对象转换为 JSON 字符串
import com.alibaba.fastjson.JSON;
public class FastjsonExample {
public static void main(String[] args) {
User user = new User();
user.setId(1);
user.setName("John Doe");
// 序列化
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString); // 输出:{"id":1,"name":"John Doe"}
}
}
class User {
private int id;
private String name;
// getter 和 setter 方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
反序列化:将 JSON 字符串转换为 Java 对象
import com.alibaba.fastjson.JSON;
public class FastjsonExample {
public static void main(String[] args) {
String jsonString = "{\"id\":1,\"name\":\"John Doe\"}";
// 反序列化
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user.getName()); // 输出:John Doe
}
}
2.2 List 与 JSON 字符串的转换
序列化:将 List
转换为 JSON 字符串
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
public class FastjsonExample {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "John Doe"));
users.add(new User(2, "Jane Doe"));
// 序列化
String jsonString = JSON.toJSONString(users);
System.out.println(jsonString); // 输出:[{"id":1,"name":"John Doe"},{"id":2,"name":"Jane Doe"}]
}
}
反序列化:将 JSON 字符串转换为 List
import com.alibaba.fastjson.JSON;
import java.util.List;
public class FastjsonExample {
public static void main(String[] args) {
String jsonString = "[{\"id\":1,\"name\":\"John Doe\"},{\"id\":2,\"name\":\"Jane Doe\"}]";
// 反序列化
List<User> users = JSON.parseArray(jsonString, User.class);
for (User user : users) {
System.out.println(user.getName());
}
}
}
3. 注解支持
Fastjson
提供了 @JSONField
注解,可以用来控制字段的序列化和反序列化行为。
import com.alibaba.fastjson.annotation.JSONField;
public class User {
private int id;
@JSONField(name = "fullName")
private String name;
@JSONField(serialize = false)
private String password;
// getter 和 setter
}
在这个例子中:
@JSONField(name = "fullName")
会将name
字段序列化为fullName
。@JSONField(serialize = false)
会使password
字段不被序列化。
4. JSONPath 查询
Fastjson
支持 JSONPath
,这是一种用于查询 JSON 数据的表达式语言。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONPath;
import java.util.Map;
public class FastjsonExample {
public static void main(String[] args) {
String jsonString = "{\"id\":1,\"name\":\"John Doe\",\"address\":{\"city\":\"New York\"}}";
Map<String, Object> data = JSON.parseObject(jsonString);
// 使用 JSONPath 查询
Object city = JSONPath.eval(data, "$.address.city");
System.out.println(city); // 输出:New York
}
}
5. 性能与安全
Fastjson
以其高性能著称,但在使用时需要注意安全性问题,特别是在反序列化过程中可能会存在反序列化漏洞。因此,在使用 Fastjson
进行反序列化时,应确保 JSON 数据来源的可信性,并尽可能使用 JSON.parseObject(String text, Class<T> clazz)
等安全的方法。
6. 版本与兼容性
确保使用最新版本的 Fastjson
,因为更新版本通常会修复已知的安全问题和性能问题。
7.常用方法
7.1 JSON.toJSONString(Object object)
将 Java 对象序列化为 JSON 字符串。
import com.alibaba.fastjson.JSON;
public class FastjsonExample {
public static void main(String[] args) {
User user = new User(1, "John Doe");
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString); // 输出:{"id":1,"name":"John Doe"}
}
}
7.2 JSON.parseObject(String text, Class<T> clazz)
将 JSON 字符串反序列化为 Java 对象。
import com.alibaba.fastjson.JSON;
public class FastjsonExample {
public static void main(String[] args) {
String jsonString = "{\"id\":1,\"name\":\"John Doe\"}";
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user.getName()); // 输出:John Doe
}
}
7.3 JSON.parseArray(String text, Class<T> clazz)
将 JSON 数组字符串反序列化为 List
对象。
import com.alibaba.fastjson.JSON;
import java.util.List;
public class FastjsonExample {
public static void main(String[] args) {
String jsonString = "[{\"id\":1,\"name\":\"John Doe\"},{\"id\":2,\"name\":\"Jane Doe\"}]";
List<User> users = JSON.parseArray(jsonString, User.class);
users.forEach(user -> System.out.println(user.getName())); // 输出:John Doe, Jane Doe
}
}
7.4 JSON.toJavaObject(JSONObject jsonObject, Class<T> clazz)
将 JSONObject
转换为指定类型的 Java 对象。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class FastjsonExample {
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", 1);
jsonObject.put("name", "John Doe");
User user = JSON.toJavaObject(jsonObject, User.class);
System.out.println(user.getName()); // 输出:John Doe
}
}
7.5 JSONObject
类
表示一个 JSON 对象。
put(String key, Object value)
:向JSONObject
中添加键值对。getString(String key)
:获取指定键的字符串值。getIntValue(String key)
:获取指定键的整数值。
import com.alibaba.fastjson.JSONObject;
public class FastjsonExample {
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", 1);
jsonObject.put("name", "John Doe");
String name = jsonObject.getString("name");
int id = jsonObject.getIntValue("id");
System.out.println("Name: " + name); // 输出:Name: John Doe
System.out.println("ID: " + id); // 输出:ID: 1
}
}
7.6 JSONArray
类
表示一个 JSON 数组。
add(Object value)
:向JSONArray
中添加元素。getJSONObject(int index)
:获取指定索引处的JSONObject
。getString(int index)
:获取指定索引处的字符串值。import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class FastjsonExample { public static void main(String[] args) { JSONArray jsonArray = new JSONArray(); JSONObject user1 = new JSONObject(); user1.put("id", 1); user1.put("name", "John Doe"); JSONObject user2 = new JSONObject(); user2.put("id", 2); user2.put("name", "Jane Doe"); jsonArray.add(user1); jsonArray.add(user2); JSONObject firstUser = jsonArray.getJSONObject(0); System.out.println(firstUser.getString("name")); // 输出:John Doe } }
7.7 反序列化为泛型类型
在反序列化时,如果要处理泛型类型,可以使用 TypeReference
来指定类型.
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.List;
import java.util.Map;
public class FastjsonExample {
public static void main(String[] args) {
String jsonString = "[{\"id\":1,\"name\":\"John Doe\"},{\"id\":2,\"name\":\"Jane Doe\"}]";
// 使用 TypeReference 反序列化为泛型类型
List<Map<String, Object>> userList = JSON.parseObject(jsonString, new TypeReference<List<Map<String, Object>>>() {});
for (Map<String, Object> user : userList) {
System.out.println(user.get("name"));
}
}
}
8.配置选项
Fastjson
提供了许多配置选项,可以通过 SerializerFeature
和 ParserConfig
来调整序列化和反序列化行为。
8.1 SerializerFeature
用于控制序列化的行为。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class FastjsonExample {
public static void main(String[] args) {
User user = new User(1, "John Doe");
String jsonString = JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty);
System.out.println(jsonString); // 空字符串字段会被序列化为空字符串,而不是 null
}
}
8.2 ParserConfig
用于配置反序列化的行为,如注册自定义反序列化器。
import com.alibaba.fastjson.parser.ParserConfig;
public class FastjsonExample {
public static void main(String[] args) {
ParserConfig.getGlobalInstance().addAccept("com.example"); // 配置安全白名单
}
}
9.总结
- 提供服务器端、安卓客户端两种解析工具,性能表现较好。
- 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
- 允许转换预先存在的无法修改的对象(只有class、无源代码)。
- Java泛型的广泛支持。
- 允许对象的自定义表示、允许自定义序列化类。
- 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。
🌟感谢支持 听忆.-CSDN博客
🎈众口难调🎈从心就好 |