Fastjson1 反序列化方法 parseObject / parseArray
对于 Java 开发者来说,JSON(JavaScript Object Notation)是日常开发中最常用的数据交换格式之一。将 JSON 字符串转换回 Java 对象的过程,我们称之为 反序列化。Fastjson 作为阿里开源的高性能 JSON 库,提供了简单而强大的反序列化方法。现在,Fastjson1 反序列化的两个方法:parseObject 和 parseArray。
前置准备
首先,确保项目中引入了 Fastjson 依赖(Maven 示例):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
我们定义一个简单的 Java 类用于演示:
public class User {
private String name;
private int age;
// Fastjson 默认优先通过无参构造创建对象。如果类中同时存在多个有参构造且没有无参构造,反序列化可能会失败。为了代码的健壮性,强烈建议保留一个无参构造。
public User() {}
// getter 和 setter 或者使用lombok注解
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
注意:Fastjson1 反序列化时,要求类必须提供无参构造器,并且属性要有对应的 public getter/setter。
使用 parseObject 反序列化单个对象
当 JSON 字符串表示一个对象时,使用 JSON.parseObject()。
将 JSON 转为 Java 对象
String json = "{\"name\":\"张三\",\"age\":25}";
User user = JSON.parseObject(json, User.class);
System.out.println(user); // 输出:User{name='张三', age=25}
- 第一个参数:JSON 字符串
- 第二个参数:目标 Java 类的 Class 对象
parseObject 返回 JSONObject
如果不想指定类,也可以直接得到 JSONObject(它本质是一个 Map):
String json = "{\"name\":\"李四\",\"age\":30}";
JSONObject obj = JSON.parseObject(json);
System.out.println(obj.getString("name")); // 李四
System.out.println(obj.getIntValue("age")); // 30
这在临时处理不确定结构的 JSON 时非常方便。
使用 parseArray 反序列化数组/列表
当 JSON 字符串是一个数组(以 [ 开头)时,使用 JSON.parseArray()。
将 JSON 数组转为 List
String jsonArray = "[{\"name\":\"王五\",\"age\":20},{\"name\":\"赵六\",\"age\":22}]";
List<User> users = JSON.parseArray(jsonArray, User.class);
System.out.println(users);
// 输出:[User{name='王五', age=20}, User{name='赵六', age=22}]
- 第一个参数:JSON 数组字符串
- 第二个参数:列表中元素的 Class
parseArray 返回 List
如果不指定类型,会得到 List<Object>,其中每个元素是 JSONObject:
String jsonArray = "[{\"name\":\"Tom\"},{\"name\":\"Jerry\"}]";
List<Object> list = JSON.parseArray(jsonArray);
// 遍历时需手动转换
for (Object item : list) {
JSONObject obj = (JSONObject) item;
System.out.println(obj.getString("name"));
}
常见问题与注意事项
字段名称匹配
Fastjson 默认严格区分大小写。例如 JSON 中的 Name 和 Java 中的 name 不会自动匹配。可以使用 @JSONField 注解解决:
public class User {
@JSONField(name = "user_name")
private String name;
// ...
}
日期处理
如果 JSON 中包含日期字符串(如 "2026-05-20 12:00:00"),需要在 Java 类中设置相应的格式:
public class Event {
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
// ...
}
忽略未知字段
如果 JSON 中有 Java 类不存在的字段,Fastjson 默认会忽略,不会抛异常。但如果有安全需求,可以设置 Feature:
User user = JSON.parseObject(json, User.class, Feature.IgnoreNotMatch);
完整示例:综合运用
public class FastJsonDemo {
public static void main(String[] args) {
// 单个对象
String json1 = "{\"name\":\"小明\",\"age\":10}";
User user = JSON.parseObject(json1, User.class);
System.out.println("parseObject 结果:" + user);
// 对象数组
String json2 = "[{\"name\":\"小红\",\"age\":12},{\"name\":\"小刚\",\"age\":11}]";
List<User> users = JSON.parseArray(json2, User.class);
System.out.println("parseArray 结果:" + users);
// 从 JSONObject 中提取属性
JSONObject obj = JSON.parseObject(json1);
System.out.println("姓名:" + obj.getString("name"));
}
}
运行输出:
parseObject 结果:User{name='小明', age=10}
parseArray 结果:[User{name='小红', age=12}, User{name='小刚', age=11}]
姓名:小明
总结
JSON.parseObject(String, Class):反序列化单个对象JSON.parseObject(String):得到 JSONObjectJSON.parseArray(String, Class):反序列化为 ListJSON.parseArray(String):得到 List
掌握了这两个方法,你就能轻松处理大部分 JSON 反序列化场景。Fastjson1 的 API 设计非常直观,配合无参构造器和 getter/setter,让 JSON 与 Java 对象的互转变得简单。

