Fastjson通过反射与内置序列化器/反序列化器协作实现对象与JSON双向转换,依赖getter/setter、字段可访问性、类型匹配及配置策略;支持无参构造函数非强制、字段非严格一一对应、注解控制、泛型安全解析及autoType安全防护。

Fastjson 通过反射 + 内置序列化器/反序列化器协作完成对象与 JSON 字符串的双向转换,核心依赖 getter/setter 方法、字段可访问性、类型匹配和配置策略。它不强制要求无参构造函数(但反序列化时若用 setter 赋值失败,会尝试字段直赋;若字段私有且无 setter,需开启 Feature.SupportNonPublicField),也不默认要求所有字段严格一一对应(可通过 Feature.IgnoreNonFieldGetter 等控制)。
序列化:对象 → JSON 字符串
调用 JSON.toJSONString(obj) 后,Fastjson 执行以下关键步骤:
- 扫描目标对象的 public getter 方法(如
getName())或可访问字段,提取属性名与值 - 对每个属性值,根据其运行时类型选择内置
ObjectSerializer(如LongCodec、DateCodec)或自定义序列化器 - 将结果写入
SerializeWriter缓冲区,生成紧凑或格式化(启用SerializerFeature.PrettyFormat)的 JSON 字符串 - 支持注解控制,例如
@JSONField(name = "user_name")改变输出字段名,@JSONField(serialize = false)排除字段
反序列化:JSON 字符串 → 对象
使用 JSON.parseObject(json, Type.class) 时,流程如下:
- 先将 JSON 字符串解析为 Token 流(基于字符状态机,非正则匹配,效率高)
- 根据目标类
Type.class尝试创建实例:优先调用无参构造函数;若不存在,且字段为 public 或开启了非公开字段支持,则直接设置字段值 - 按 JSON 中的 key 匹配类中字段名或 getter/setter 名(如
"name"匹配setName(String)和getName()) - 对每个 value,依据目标 setter 参数类型(如
setAge(int))选择对应ObjectDeserializer进行类型转换;若类型不兼容(如 JSON 给了{"money": {"location":"CN"}},但 setter 只接受Long),则抛异常
泛型与嵌套结构处理
泛型擦除导致运行时无法直接获取完整类型信息,Fastjson 提供两种安全方式:
立即学习“Java免费学习笔记(深入)”;
- 对集合:用
JSONArray.parseArray(json, Item.class)明确指定元素类型 - 对复杂泛型(如
Map<string list>></string>):传入TypeReference,例如JSON.parseObject(json, new TypeReference<map list>>>() {})</map> - 嵌套对象字段若类型不一致(如 getter 返回
Money,setter 接收Long),反序列化必然失败——因为 Fastjson 按 setter 类型反推期望的 JSON 结构,不自动做中间转换
安全与兼容性注意事项
生产环境必须重视以下三点:
-
禁用 autoType:默认关闭(1.2.68+),但旧版本务必显式设置
ParserConfig.getGlobalInstance().setSafeMode(true)或白名单机制,防止@type引发远程代码执行 -
Date 处理差异:Fastjson 默认将
Date序列化为时间戳(毫秒值),而 Gson 默认是字符串(ISO 格式);跨框架传输时需统一格式或预处理 -
避免 getter/setter 类型错配:如
getMoney()返回Money,setMoney(long)接收Long,会导致序列化与反序列化行为不对称,应保持读写类型一致,或改用@JSONField指定序列化专用字段


















