Fastjson 处理 JSON 生成与解析指南

Fastjson 是阿里巴巴开源的高性能 JSON 库,适用于 Java 对象的序列化(生成 JSON)和反序列化(解析 JSON)。以下是详细使用指南:


1. 添加依赖
xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.39</version> <!-- 使用最新安全版本 -->
</dependency>

2. 基础用法
2.1 对象转 JSON(序列化)
java 复制代码
import com.alibaba.fastjson.JSON;

User user = new User("张三", 25);
String json = JSON.toJSONString(user);
// 输出:{"name":"张三","age":25}
2.2 JSON 转对象(反序列化)
java 复制代码
String json = "{\"name\":\"李四\",\"age\":30}";
User user = JSON.parseObject(json, User.class);

3. 常用注解
3.1 字段控制
java 复制代码
public class User {
    @JSONField(name = "user_name")  // 自定义字段名
    private String name;

    @JSONField(serialize = false)   // 忽略字段
    private String password;

    @JSONField(format = "yyyy-MM-dd HH:mm:ss")  // 日期格式化
    private Date createTime;
}
3.2 序列化顺序
java 复制代码
@JSONType(orders = {"id", "name", "age"}) // 指定字段顺序
public class User {
    private Long id;
    private String name;
    private Integer age;
}

4. 高级配置
4.1 全局配置
java 复制代码
// 序列化配置
SerializeConfig config = new SerializeConfig();
config.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd"));

// 反序列化配置
ParserConfig parserConfig = new ParserConfig();
parserConfig.setSafeMode(true); // 启用安全模式防漏洞

String json = JSON.toJSONString(obj, config);
User user = JSON.parseObject(json, User.class, parserConfig);
4.2 自定义序列化/反序列化
java 复制代码
public class MoneySerializer implements ObjectSerializer {
    @Override
    public void write(
        JSONSerializer serializer, 
        Object value, 
        Object fieldName, 
        Type fieldType, 
        int features
    ) {
        BigDecimal amount = (BigDecimal) value;
        serializer.write(amount.setScale(2) + "元");
    }
}

// 注册自定义序列化器
SerializeConfig.getGlobalInstance().put(BigDecimal.class, new MoneySerializer());

5. 处理复杂场景
5.1 泛型集合
java 复制代码
// 序列化
List<User> users = Arrays.asList(new User("张三"), new User("李四"));
String json = JSON.toJSONString(users);

// 反序列化
List<User> parsedUsers = JSON.parseArray(json, User.class);
5.2 循环引用处理
java 复制代码
// 禁用循环检测(默认开启,可能导致StackOverflow)
String json = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
5.3 忽略未知字段
java 复制代码
User user = JSON.parseObject(json, User.class, Feature.IgnoreNotMatch);

6. 性能优化
6.1 禁用特性检查
java 复制代码
// 提升序列化速度(牺牲严格校验)
String json = JSON.toJSONString(obj, 
    SerializerFeature.WriteMapNullValue, 
    SerializerFeature.DisableCheckSpecialChar
);
6.2 使用JSONWriter处理大文件
java 复制代码
try (JSONWriter writer = new JSONWriter(new FileWriter("large.json"))) {
    writer.startArray();
    for (User user : users) {
        writer.writeValue(user);
    }
    writer.endArray();
}

7. 安全防护
7.1 启用安全模式
java 复制代码
ParserConfig.getGlobalInstance().setSafeMode(true); // 禁止反序列化任意类
7.2 白名单控制
java 复制代码
// 只允许反序列化指定类
ParserConfig.getGlobalInstance().addAccept("com.example.model.");

8. 与 Spring 集成
8.1 替换 Spring MVC 默认 JSON 处理器
java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        converter.setFastJsonConfig(fastJsonConfig());
        converters.add(0, converter);
    }

    private FastJsonConfig fastJsonConfig() {
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(SerializerFeature.PrettyFormat);
        config.setDateFormat("yyyy-MM-dd HH:mm:ss");
        return config;
    }
}

9. 常见问题解决
9.1 日期格式不匹配
java 复制代码
// 全局配置日期格式
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
String json = JSON.toJSONString(new Date()); // 输出 "2023-01-01"
9.2 字段名大小写问题
java 复制代码
// 驼峰转下划线命名
Model model = new Model();
model.setUserName("test");
String json = JSON.toJSONString(model, SerializerFeature.UseSnakeCase);
// 输出 {"user_name":"test"}
9.3 处理枚举类型
java 复制代码
public enum Status {
    @JSONField(name = "OK")  // 自定义枚举值名称
    SUCCESS,
    @JSONField(name = "ERR")
    FAILED
}

String json = JSON.toJSONString(Status.SUCCESS); // 输出 "OK"

10. 性能对比建议
场景 推荐方案
高并发接口 Fastjson 默认配置 + 安全模式
复杂嵌套对象 禁用循环引用检测 + 缓存配置
处理超大 JSON 文件 使用 JSONReader/JSONWriter
需要严格类型安全 启用安全模式 + 白名单控制

注意事项
  1. 版本安全 :始终使用官方最新版本(Maven 仓库),避免历史漏洞。
  2. 数据来源:反序列化外部输入时,务必启用安全模式或白名单。
  3. 线程安全ParserConfigSerializeConfig 建议全局单例。
  4. 兼容性:Fastjson 与其他 JSON 库混用时,注意注解冲突问题。

通过合理配置,Fastjson 能以接近极限的性能处理 JSON 数据,但需在功能、安全、性能之间做好权衡。

相关推荐
oak隔壁找我6 分钟前
SpringBoot 实现 JWT 认证完整方案
java·后端
程序_白白22 分钟前
探讨一下java将来未来两年内的就业以及发展
java·开发语言
码农葫芦侠29 分钟前
Qt如何翻译JSON内容
qt·json
oak隔壁找我33 分钟前
RabbitMQ 实现延迟通知的完整方案
java·后端
信码由缰37 分钟前
Java的优势有哪些
java
trow44 分钟前
ConcurrentHashMap线程安全实现详解
java·后端
trow44 分钟前
HashMap核心原理与源码剖析
java·后端
小丫头呀1 小时前
.NET8 通过自定义类映射appsettings.json 文件某个节点的配置
json·.net·.net8
可观测性用观测云1 小时前
云原生架构下微服务接入 SkyWalking 最佳实践
java
_殊途2 小时前
项目开发手册-开发流程
java