使用Fastjson進(jìn)行JSON生成與解析的新手指南
Fastjson 是阿里巴巴開源的高性能 JSON 庫(kù),適用于 Java 對(duì)象的序列化(生成 JSON)和反序列化(解析 JSON)。以下是詳細(xì)使用指南:
1. 添加依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.39</version> <!-- 使用最新安全版本 -->
</dependency>
2. 基礎(chǔ)用法
2.1 對(duì)象轉(zhuǎn) JSON(序列化)
import com.alibaba.fastjson.JSON;
User user = new User("張三", 25);
String json = JSON.toJSONString(user);
// 輸出:{"name":"張三","age":25}
2.2 JSON 轉(zhuǎn)對(duì)象(反序列化)
String json = "{\"name\":\"李四\",\"age\":30}";
User user = JSON.parseObject(json, User.class);
3. 常用注解
3.1 字段控制
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 序列化順序
@JSONType(orders = {"id", "name", "age"}) // 指定字段順序
public class User {
private Long id;
private String name;
private Integer age;
}
4. 高級(jí)配置
4.1 全局配置
// 序列化配置
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 自定義序列化/反序列化
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) + "元");
}
}
???????// 注冊(cè)自定義序列化器
SerializeConfig.getGlobalInstance().put(BigDecimal.class, new MoneySerializer());5. 處理復(fù)雜場(chǎng)景
5.1 泛型集合
// 序列化
List<User> users = Arrays.asList(new User("張三"), new User("李四"));
String json = JSON.toJSONString(users);
// 反序列化
List<User> parsedUsers = JSON.parseArray(json, User.class);
5.2 循環(huán)引用處理
// 禁用循環(huán)檢測(cè)(默認(rèn)開啟,可能導(dǎo)致StackOverflow) String json = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
5.3 忽略未知字段
User user = JSON.parseObject(json, User.class, Feature.IgnoreNotMatch);
6. 性能優(yōu)化
6.1 禁用特性檢查
// 提升序列化速度(犧牲嚴(yán)格校驗(yàn))
String json = JSON.toJSONString(obj,
SerializerFeature.WriteMapNullValue,
SerializerFeature.DisableCheckSpecialChar
);
6.2 使用JSONWriter處理大文件
try (JSONWriter writer = new JSONWriter(new FileWriter("large.json"))) {
writer.startArray();
for (User user : users) {
writer.writeValue(user);
}
writer.endArray();
}
7. 安全防護(hù)
7.1 啟用安全模式
ParserConfig.getGlobalInstance().setSafeMode(true); // 禁止反序列化任意類
7.2 白名單控制
// 只允許反序列化指定類
ParserConfig.getGlobalInstance().addAccept("com.example.model.");
8. 與 Spring 集成
替換 Spring MVC 默認(rèn) JSON 處理器
@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 日期格式不匹配
// 全局配置日期格式 JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; String json = JSON.toJSONString(new Date()); // 輸出 "2023-01-01"
9.2 字段名大小寫問題
// 駝峰轉(zhuǎn)下劃線命名
Model model = new Model();
model.setUserName("test");
String json = JSON.toJSONString(model, SerializerFeature.UseSnakeCase);
// 輸出 {"user_name":"test"}
9.3 處理枚舉類型
public enum Status {
@JSONField(name = "OK") // 自定義枚舉值名稱
SUCCESS,
@JSONField(name = "ERR")
FAILED
}
String json = JSON.toJSONString(Status.SUCCESS); // 輸出 "OK"
10. 性能對(duì)比建議
| 場(chǎng)景 | 推薦方案 |
|---|---|
| 高并發(fā)接口 | Fastjson 默認(rèn)配置 + 安全模式 |
| 復(fù)雜嵌套對(duì)象 | 禁用循環(huán)引用檢測(cè) + 緩存配置 |
| 處理超大 JSON 文件 | 使用 JSONReader/JSONWriter |
| 需要嚴(yán)格類型安全 | 啟用安全模式 + 白名單控制 |
11.注意事項(xiàng)
- 版本安全:始終使用官方最新版本(Maven 倉(cāng)庫(kù)),避免歷史漏洞。
- 數(shù)據(jù)來源:反序列化外部輸入時(shí),務(wù)必啟用安全模式或白名單。
- 線程安全:ParserConfig 和 SerializeConfig 建議全局單例。
- 兼容性:Fastjson 與其他 JSON 庫(kù)混用時(shí),注意注解沖突問題。
通過合理配置,F(xiàn)astjson 能以接近極限的性能處理 JSON 數(shù)據(jù),但需在功能、安全、性能之間做好權(quán)衡。
到此這篇關(guān)于使用Fastjson進(jìn)行JSON生成與解析的新手指南的文章就介紹到這了,更多相關(guān)Fastjson處理JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于@RequestParam name和value屬性的區(qū)別
這篇文章主要介紹了@RequestParam name和value屬性的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
RabbitMQ交換機(jī)與Springboot整合的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了RabbitMQ交換機(jī)與Springboot整合的簡(jiǎn)單實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
SpringBoot統(tǒng)一API響應(yīng)結(jié)果封裝的示例詳解
在Spring Boot項(xiàng)目中,統(tǒng)一API響應(yīng)結(jié)果封裝是一種常用的技術(shù)實(shí)踐,旨在提高開發(fā)效率、降低代碼重復(fù)率,并提供一致的API響應(yīng)格式,從而簡(jiǎn)化前后端交互和錯(cuò)誤處理,感興趣的小伙伴可以了解下2025-03-03
Java skill動(dòng)態(tài)指定feign的訪問地址方式
在使用Feign調(diào)用內(nèi)部服務(wù)時(shí),通過Redis查詢ELB地址并進(jìn)行調(diào)用,遇到的問題包括:指定的地址在Nacos服務(wù)名中不存在時(shí),URL參數(shù)需要賦初始值;使用ThreadLocal獲取當(dāng)前線程信息時(shí)易出問題,建議使用MDC跨線程傳遞參數(shù),并注意請(qǐng)求結(jié)束后的清理2026-01-01
教你安裝eclipse2021并配置內(nèi)網(wǎng)maven中心倉(cāng)庫(kù)的圖文詳解
本文能通過圖文并茂的形式給大家介紹安裝eclipse2021并配置內(nèi)網(wǎng)maven中心倉(cāng)庫(kù)的相關(guān)知識(shí),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09
Spring?Boot?3?整合?MinIO?實(shí)現(xiàn)分布式文件存儲(chǔ)的全過程
本文介紹了如何使用SpringBoot3和MinIO實(shí)現(xiàn)分布式文件存儲(chǔ),通過MinIO的分布式對(duì)象存儲(chǔ)系統(tǒng),可以解決傳統(tǒng)單機(jī)文件存儲(chǔ)方案在面對(duì)大規(guī)模數(shù)據(jù)和高并發(fā)訪問時(shí)的不足,文章詳細(xì)講解了MinIO的安裝、配置和使用,感興趣的朋友一起看看吧2025-03-03
SpringBoot之Order注解啟動(dòng)順序說明
這篇文章主要介紹了SpringBoot之Order注解啟動(dòng)順序說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
淺談Java中向上造型向下造型和接口回調(diào)中的問題
這篇文章主要介紹了淺談Java中向上造型向下造型和接口回調(diào)中的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
詳解java中的PropertyChangeSupport與PropertyChangeListener
這篇文章主要介紹了詳解java中的PropertyChangeSupport與PropertyChangeListener的相關(guān)資料,需要的朋友可以參考下2017-09-09

