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 数据,但需在功能、安全、性能之间做好权衡。

相关推荐
Mryan20052 小时前
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
java·开发语言·spring boot·maven
inxunoffice2 小时前
按规则批量修改 txt/html/json/xml/csv/记事本等文本文件内容
xml·json
VX_CXsjNo12 小时前
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
java·spring boot·spring·游戏·eclipse·android studio·android-studio
ylfhpy2 小时前
Java面试黄金宝典33
java·开发语言·数据结构·面试·职场和发展·排序算法
乘风!2 小时前
Java导出excel,表格插入pdf附件,以及实现过程中遇见的坑
java·pdf·excel
小小鸭程序员2 小时前
Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践
java·vue.js·spring·ui·elementui
南宫生3 小时前
Java迭代器【设计模式之迭代器模式】
java·学习·设计模式·kotlin·迭代器模式
seabirdssss3 小时前
通过动态获取项目的上下文路径来确保请求的 URL 兼容两种启动方式(IDEA 启动和 Tomcat 部署)下都能正确解析
java·okhttp·tomcat·intellij-idea
kill bert4 小时前
第30周Java分布式入门 消息队列 RabbitMQ
java·分布式·java-rabbitmq
穿林鸟5 小时前
Spring Boot项目信创国产化适配指南
java·spring boot·后端