Fastjson1 序列化 toJSONString

序列化是Java开发中需要经常使用的方法, Fastjson1 中这个操作主要是通过 JSON.toJSONString 方法完成的,这与Fastjson2序列化的方法类似。

什么是序列化?

序列化简单来说,就是把 Java 对象转换成 JSON 字符串的过程。比如你有一个 User 对象,里面存了姓名、年龄,你想把它变成 {"name":"张三","age":25} 这样的字符串,这就是序列化。

Fastjson1 提供的 toJSONString 方法,正是用来干这件事的。

环境准备

首先,在你的 Maven 项目中引入依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

如果是 Gradle:

implementation 'com.alibaba:fastjson:1.2.83'

基础用法:Java对象转JSON

我们先创建一个简单的 User 类:

public class User {
    private String name;
    private int age;

    // Fastjson 默认优先通过无参构造创建对象。如果类中同时存在多个有参构造且没有无参构造,反序列化可能会失败。为了代码的健壮性,强烈建议保留一个无参构造。
    public User() {} 

    // 为了方便,加个带参构造
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 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; }
}

然后调用 toJSONString 方法:

import com.alibaba.fastjson.JSON;

public class Main {
    public static void main(String[] args) {
        User user = new User("张三", 25);
        String jsonStr = JSON.toJSONString(user);
        System.out.println(jsonStr); 
        // 输出:{"age":25,"name":"张三"}
    }
}

上面的例子中通过toJSONString 方法将对象变成了 JSON 字符串。

序列化集合和数组

toJSONString 不仅支持单个对象,还支持 List、Map 等集合类型:

import java.util.*;

List<User> userList = new ArrayList<>();
userList.add(new User("李四", 30));
userList.add(new User("王五", 28));

String jsonArray = JSON.toJSONString(userList);
System.out.println(jsonArray);
// 输出:[{"age":30,"name":"李四"},{"age":28,"name":"王五"}]

Map 也一样:

Map<String, Object> map = new HashMap<>();
map.put("status", 200);
map.put("message", "success");
map.put("data", userList);//userList是上面创建的list

String jsonMap = JSON.toJSONString(map);
System.out.println(jsonMap);
// 输出:{"data":[{"age":30,"name":"李四"},{"age":28,"name":"王五"}],"message":"success","status":200}

处理日期和时间

有时候对象里包含日期字段,默认会被序列化成时间戳。我们可以通过注解来控制格式:

import com.alibaba.fastjson.annotation.JSONField;
import java.util.Date;

public class Event {
    private String title;

    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    // 构造、getter/setter 省略...
}

序列化结果中 createTime 就会变成 "2026-05-15 14:30:00" 这样的格式。

常用格式模板:

  • yyyy.MM.dd → 2026.05.15
  • yyyyMMdd→ 20260515
  • yyyyMMddHHmmss→ 20260515143000
  • yyyy-MM-dd HH:mm→ 2026-05-15 14:30
  • yyyy/MM/dd HH:mm:ss→ 2026/05/15 14:30:00
  • yyyy.MM.dd HH:mm:ss → 2026.05.15 14:30:00
  • yyyy-MM-dd HH:mm:ss.SSS → 2026-05-15 14:30:00.123
  • yyyy-MM-dd'T'HH:mm:ss → 2026-05-15T14:30:00
  • MM-dd-yyyy→ 05-15-2026
  • dd-MM-yyyy→ 15-05-2026
  • yyyy年MM月dd日 → 2026年05月15日
  • yyyy年MM月dd日 HH时mm分ss秒 → 2026年05月15日 14时30分00秒

反序列化日期字符串

将 JSON 字符串转为对象

当 JSON 中包含日期字符串时,Fastjson 能自动识别并反序列化:

过滤字段:只序列化需要的属性

有时候我们不想把某些敏感字段(比如密码)输出到 JSON 中,可以用 @JSONField(serialize=false)

public class Account {
    private String username;

    @JSONField(serialize = false)
    private String password;

    // getter/setter...
}

这样序列化时 password 字段就会被忽略。

为什么选择 toJSONString?

toJSONString 是 Fastjson1 中最核心的序列化方法,它支持:

  • 普通 Java 对象
  • 集合、数组
  • 泛型类型
  • 复杂的嵌套对象
  • 通过注解灵活控制序列化行为

而且它的性能非常优秀,在早期 Java 生态中几乎是处理 JSON 最快的库之一(虽然有后来的安全事件,但基本用法依然广泛)。

常见问题

Q: 序列化后字段顺序和定义不一致?

A: Fastjson 默认是按字母顺序输出。如果需要保持字段定义顺序,可以使用 @JSONType(orders = {"name","age"}) 或在类上添加注解。

Q: 出现循环引用怎么办?

A: 例如 A 引用 B,B 又引用 A。可以使用 SerializerFeature.DisableCircularReferenceDetect 特性,但最好从设计层面避免。

总结

toJSONString 是 Fastjson1 的入口级方法,掌握它就掌握了序列化的核心。