Java Fastjson 使用指南

news/2025/2/10 6:18:43/文章来源:https://www.cnblogs.com/szz1/p/18707027

1. 简介

Fastjson 是阿里巴巴开源的高性能 JSON 解析库,专为 Java 设计,具备超快的 JSON 解析速度和丰富的功能。它支持 JSON 与 Java 对象之间的序列化与反序列化,适用于 Web 应用、分布式系统、缓存等场景。

本文将介绍 Fastjson 的基础概念、使用方法、常见实践以及最佳实践,帮助开发者高效使用 Fastjson 进行 JSON 处理。


2. 目录

  1. Fastjson 介绍
  2. Fastjson 依赖配置
  3. JSON 序列化和反序列化
  4. 使用 JSONPath 查询 JSON 数据
  5. 配置 Fastjson 特性
  6. 常见实践
  7. 安全性注意事项
  8. 总结
  9. 参考资料

3. Fastjson 依赖配置

pom.xml 中添加 Fastjson 依赖:

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

注意:Fastjson 1.x 版本存在安全漏洞,建议使用 2.x 版本:

<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.37</version>
</dependency>

4. JSON 序列化和反序列化

4.1 Java 对象转 JSON 字符串(序列化)

import com.alibaba.fastjson.JSON;class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}// 省略 getter 和 setter 方法
}public class FastjsonExample {public static void main(String[] args) {User user = new User("Alice", 25);String jsonString = JSON.toJSONString(user);System.out.println(jsonString);}
}

输出:

{"age":25,"name":"Alice"}

4.2 JSON 字符串转 Java 对象(反序列化)

String json = "{\"age\":25,\"name\":\"Alice\"}";
User user = JSON.parseObject(json, User.class);
System.out.println(user.getName()); // Alice

4.3 解析 JSON 数组

String jsonArray = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";
List<User> users = JSON.parseArray(jsonArray, User.class);
System.out.println(users.get(1).getName()); // Bob

5. 使用 JSONPath 查询 JSON 数据

Fastjson 提供 JSONPath 以便高效查询 JSON 结构化数据。

5.1 查询 JSON 中的某个字段

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONPath;String json = "{\"name\":\"Alice\",\"age\":25,\"address\":{\"city\":\"Shanghai\",\"zip\":\"200000\"}}";
Object city = JSONPath.read(json, "$.address.city");
System.out.println(city); // Shanghai

5.2 查询 JSON 数组中的对象

String jsonArray = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";
List<Object> names = (List<Object>) JSONPath.read(jsonArray, "$[*].name");
System.out.println(names); // [Alice, Bob]

6. 配置 Fastjson 特性

Fastjson 提供了丰富的配置选项,例如:

6.1 格式化 JSON 输出

String prettyJson = JSON.toJSONString(user, true);
System.out.println(prettyJson);

6.2 序列化时忽略 null

String jsonString = JSON.toJSONString(user, SerializerFeature.WriteMapNullValue);

6.3 禁止循环引用

String jsonString = JSON.toJSONString(user, SerializerFeature.DisableCircularReferenceDetect);

7. 常见实践

7.1 处理复杂 JSON 结构

JSONObject jsonObject = JSON.parseObject("{\"data\":{\"user\":{\"name\":\"Alice\"}}}");
String name = jsonObject.getJSONObject("data").getJSONObject("user").getString("name");
System.out.println(name); // Alice

7.2 JSON 转 Map

Map<String, Object> map = JSON.parseObject(json, new TypeReference<Map<String, Object>>() {});
System.out.println(map.get("name"));

7.3 JSON 转 Java BeanList

List<User> userList = JSON.parseArray(jsonArray, User.class);
System.out.println(userList.get(0).getName());

8. 安全性注意事项

Fastjson 存在反序列化漏洞,尤其是 1.x 版本,容易遭受反序列化攻击。建议采取以下措施:

  1. 升级到 Fastjson 2.x(如 2.0.37),避免已知漏洞。
  2. 启用安全模式
    ParserConfig.getGlobalInstance().setSafeMode(true);
    
  3. 禁用自动类型解析
    JSON.parseObject(json, Object.class, Feature.SupportAutoType);
    
  4. 使用白名单机制
    ParserConfig.getGlobalInstance().addAccept("com.example.");
    

9. 总结

本文介绍了 Java Fastjson 的核心功能,包括:

  • Fastjson 依赖配置
  • JSON 序列化和反序列化
  • JSONPath 高效查询 JSON 数据
  • Fastjson 配置项及最佳实践
  • 安全性注意事项

Fastjson 是一个高效、易用的 JSON 处理库,但使用时应注意安全性,特别是在处理不可信数据时,务必禁用自动类型解析或启用安全模式。


10. 参考资料

  • Fastjson GitHub
  • Fastjson 2.x 官方文档
  • JSONPath 语法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881523.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

护眼神器!LightBulb电脑屏幕护眼软件,你值得拥有!

点击上方蓝字关注我 前言 LightBulb是一个免费的护眼软件,它可以帮助我们在晚上或长时间看电脑屏幕时,减少眼睛的不舒服和疲劳。这个软件会随着一天时间的推移,自动调整电脑屏幕的颜色。比如,在白天,它会让屏幕颜色更偏向冷蓝色,就像阳光下的颜色;到了晚上,它会让屏幕颜…

【JWT安全】攻防指南全面梳理

一、简单介绍 JWT(JSON Web Token)是一种用于身份认证和授权的开放标准,它通过在网络应用间传递被加密的JSON数据来安全地传输信息使得身份验证和授权变得更加简单和安全,JWT对于渗透测试人员而言可能是一种非常吸引人的攻击途径,因为它们不仅是让你获得无限访问权限的关键而…

【CodeForces训练记录】Codeforces Round 1003 (Div. 4)

训练情况赛后反思 题面读的有点疑惑,怀疑自己阅读理解不大行了,简单题狂WA,C2二分调半天没出,水平严重退步 A题 最后两个字母 us 换成 i点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;void solve(){string s;…

[流程图/技术调研] drawio : 流程图绘制工具

引言 流程图绘制工具: draw.io 简介urlhttps://www.drawio.com/ (官网首页) https://github.com/jgraph/drawio (github)【官网简介】 drawio 这个项目,是一个可配置的图表/白板可视化应用程序。drawio 是由 JGraph Ltd 和 draw AG 共同拥有和开发的。 在运行这个项目的同时,…

国家中小学智慧教育平台新教材及音频下载神器

点击上方蓝字关注我 前言 国家中小学智慧教育平台是一个专门给老师、孩子们提供学习资源的网站,上面有很多专业的教学视频、课件和教材。不过,这些学习资料都只能在网上看,如果没有网络就连不上了。 而这个下载器的作用就像是一个“搬运工”,它可以把这些网上的视频、课件和…

【牛客训练记录】牛客周赛 Round 80

训练情况赛后反思 玩了一两天发现自己水平直接下降一个档次,简单的C题模拟没写出来 A题 直接判断剩下还能放几个棋子,如果小于零就无法放置,否则直接输出即可点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;voi…

【蓝桥训练记录】第 26 场 蓝桥入门赛

训练情况赛后反思 唐完了,二分没看出来 A题 字母排序点击查看代码 #include <iostream> using namespace std; int main() {cout<<"aekns";return 0; }B题 统计两个字符串中 01 的数量,异或找两个不同的数字的出现次数取最小值,再求和即可点击查看代码…

手把手教你一招永久解决DeepSeek服务器繁忙!

前几天A梦分享过DeepSeek的三种使用方式:移动应用APP、网页版本和本地部署。由于DeepSeek的用户数量庞大,导致请求频次较高,用户常常会遇到"服务器繁忙,请稍后重试"的提示。而选择本地部署则可以避免这种问题,并且支持离线使用。正因如此,官方推荐用户选择本地…

[AI/GPT] AI大模型的基础概念

概述:AI大模型 基础概念 幻觉现象 = 一本正经胡说八道AI幻觉,是指大语言模型【编造】它认为是真实存在的、甚至看起来合理或可信的信息。 大模型出现幻觉,简而言之就是“胡说八道”。 准确而言,是指模型生成的内容与现实世界事实或用户输入不一致的现象。 研究人员将大模型…

Nacos的应用案例实战

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.Nacos实现服务注册和发现实战案例1.部署Nacos集群2.运行服务提供者的JAVA应用2.1 安装JDK2.2 安装Maven2.3 解压准备好的JAVA示例应用2.4 查看Nacos服务相关配置是否正确信息2.5 编译JAVA代码2.6 运行…

前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截

前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截2个月前AdBlock/AdBlock Plus疑似升级了一次因为自己主要负责面对海外的用户项目,发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了,于是专门研究了一下。并尝试了很多方法。 已失效的老方法…

[Whole Web] 前端项目规范 -- 4. Git提交信息规范(Commitlint + commitizen + cz-git)

前面讲的都是在git提交之前的一些流程检查,而当我们git提交的时候,提交信息,也应该是需要规范的 commitlint 在使用Git提交代码时,通常都需要填写提交说明,也就是Commit Message git commit -m 提交测试说白了,Commit Message就是我们提交的时候,在-m后面写的提交说明,…