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.15yyyyMMdd→ 20260515yyyyMMddHHmmss→ 20260515143000yyyy-MM-dd HH:mm→ 2026-05-15 14:30yyyy/MM/dd HH:mm:ss→ 2026/05/15 14:30:00yyyy.MM.dd HH:mm:ss→ 2026.05.15 14:30:00yyyy-MM-dd HH:mm:ss.SSS→ 2026-05-15 14:30:00.123yyyy-MM-dd'T'HH:mm:ss→ 2026-05-15T14:30:00MM-dd-yyyy→ 05-15-2026dd-MM-yyyy→ 15-05-2026yyyy年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 的入口级方法,掌握它就掌握了序列化的核心。

