使用Fastjson進行JSON生成與解析的新手指南
Fastjson 是阿里巴巴開源的高性能 JSON 庫,適用于 Java 對象的序列化(生成 JSON)和反序列化(解析 JSON)。以下是詳細使用指南:
1. 添加依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.39</version> <!-- 使用最新安全版本 --> </dependency>
2. 基礎(chǔ)用法
2.1 對象轉(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)對象(反序列化)
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. 高級配置
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) + "元"); } } ???????// 注冊自定義序列化器 SerializeConfig.getGlobalInstance().put(BigDecimal.class, new MoneySerializer());
5. 處理復(fù)雜場景
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)檢測(默認開啟,可能導(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 禁用特性檢查
// 提升序列化速度(犧牲嚴格校驗) 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. 安全防護
7.1 啟用安全模式
ParserConfig.getGlobalInstance().setSafeMode(true); // 禁止反序列化任意類
7.2 白名單控制
// 只允許反序列化指定類 ParserConfig.getGlobalInstance().addAccept("com.example.model.");
8. 與 Spring 集成
替換 Spring MVC 默認 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. 性能對比建議
場景 | 推薦方案 |
---|---|
高并發(fā)接口 | Fastjson 默認配置 + 安全模式 |
復(fù)雜嵌套對象 | 禁用循環(huán)引用檢測 + 緩存配置 |
處理超大 JSON 文件 | 使用 JSONReader/JSONWriter |
需要嚴格類型安全 | 啟用安全模式 + 白名單控制 |
11.注意事項
- 版本安全:始終使用官方最新版本(Maven 倉庫),避免歷史漏洞。
- 數(shù)據(jù)來源:反序列化外部輸入時,務(wù)必啟用安全模式或白名單。
- 線程安全:ParserConfig 和 SerializeConfig 建議全局單例。
- 兼容性:Fastjson 與其他 JSON 庫混用時,注意注解沖突問題。
通過合理配置,F(xiàn)astjson 能以接近極限的性能處理 JSON 數(shù)據(jù),但需在功能、安全、性能之間做好權(quán)衡。
到此這篇關(guān)于使用Fastjson進行JSON生成與解析的新手指南的文章就介紹到這了,更多相關(guān)Fastjson處理JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)在線考試系統(tǒng)與設(shè)計(學(xué)生功能)
這篇文章主要介紹了Java實現(xiàn)在線考試系統(tǒng)與設(shè)計(學(xué)生功能),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02Java輕松掌握面向?qū)ο蟮娜筇匦苑庋b與繼承和多態(tài)
本文主要講述的是面向?qū)ο蟮娜筇匦裕悍庋b,繼承,多態(tài),內(nèi)容含括從封裝到繼承再到多態(tài)的所有重點內(nèi)容以及使用細節(jié)和注意事項,內(nèi)容有點長,請大家耐心看完2022-05-05啟動異常invalid constant type:15的解決方案
今天小編就為大家分享一篇關(guān)于啟動異常invalid constant type:15的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12