Fastjson1 反序列化方法 parseObject / parseArray

对于 Java 开发者来说,JSON(JavaScript Object Notation)是日常开发中最常用的数据交换格式之一。将 JSON 字符串转换回 Java 对象的过程,我们称之为 反序列化。Fastjson 作为阿里开源的高性能 JSON 库,提供了简单而强大的反序列化方法。现在,Fastjson1 反序列化的两个方法:parseObjectparseArray

前置准备

首先,确保项目中引入了 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):得到 JSONObject
  • JSON.parseArray(String, Class):反序列化为 List
  • JSON.parseArray(String):得到 List

掌握了这两个方法,你就能轻松处理大部分 JSON 反序列化场景。Fastjson1 的 API 设计非常直观,配合无参构造器和 getter/setter,让 JSON 与 Java 对象的互转变得简单。