目录
- 概述
- 快速入门
- 常用 API
- 高级特性
- 性能优化
- 安全性
- 参考资料
概述
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);
String jsonString = JSON.toJSONString(user); System.out.println("JSON 字符串:" + jsonString);
User deserializedUser = JSON.parseObject(jsonString, User.class); System.out.println("反序列化对象:" + deserializedUser); } }
class User { private String name; private int age;
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);
|
自定义序列化
可以使用 SerializeConfig
和 SerializerFeature
来自定义序列化行为。
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);
|
高级特性
自定义序列化和反序列化
自定义序列化
通过实现 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;
}
|
解析复杂 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);
|
性能优化
安全性
- 避免反序列化漏洞:不要反序列化不可信的 JSON 数据,以防止反序列化漏洞。
- 配置安全特性:使用
ParserConfig
禁用一些不安全的类。1
| ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
|
参考资料