各位在代码世界打坐修行的道友们!今天我们要参悟Google出品的JSON心法------Gson!这货就像代码界的扫地僧,表面朴实无华,实则内力深厚,专治各种JSON不服!准备好迎接"万物皆可JSON"的顿悟时刻了吗? 🧘♂️
第一重境界:筑基期(基本操作)
口诀1:对象→ JSON (一键飞升)
ini
Gson gson = new Gson();
User user = new User("张真人", 108);
String json = gson.toJson(user);
// 输出:{"name":"张真人","age":108}
// 注意!字段名自动匹配,比相亲成功率还高!
口诀2: JSON →对象(夺舍重生)
ini
String json = "{"name":"灭绝师太","age":99}";
User user = gson.fromJson(json, User.class);
// 警告!如果JSON多出字段,Gson会装作没看见(佛系处理)
第二重境界:金丹期(高级玩法)
秘术1:时间线管理大师
scss
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd HH:mm:ss") // 统一时间格式
.registerTypeAdapter(Date.class, new DateDeSerializer()) // 自定义时间解析
.create();
// 从此告别"时间戳失忆症"和"时区错乱症"!
秘术2:字段名变形术
kotlin
public class Product {
@SerializedName("product_name") // 字段别名大法
private String name;
@Expose(serialize = false) // 禁止序列化(社恐字段)
private String secretKey;
}
// 从此JSON字段和Java对象实现"双语自由切换"!
第三重境界:元婴期(复杂渡劫)
渡劫场景1: 泛型 集合(套娃十级选手)
ini
Type userListType = new TypeToken<List<User>>(){}.getType();
List<User> users = gson.fromJson(jsonArrayStr, userListType);
// 友情提示:TypeToken必须用匿名内部类,否则走火入魔!
渡劫场景2:多态对象(七十二变处理)
scss
Gson gson = new GsonBuilder()
.registerTypeAdapter(Animal.class, new AnimalTypeAdapter())
.create();
// 需要自定义TypeAdapter区分猫狗(否则会得到薛定谔的动物)
第四重境界:大乘期(性能调优)
心法1:禁用 HTML 转义(加速大法)
scss
Gson gson = new GsonBuilder()
.disableHtmlEscaping() // 关闭防御结界
.create();
// 速度↑↑↑ 但小心XSS老魔偷袭!
心法2:流式处理( 内存 管理尊者)
java
try (JsonReader reader = new JsonReader(new FileReader("data.json"))) {
while (reader.hasNext()) {
User user = gson.fromJson(reader, User.class);
// 处理海量数据不爆内存(打工人996的福音)
}
}
心魔试炼(常见走火入魔场景)
心魔1:字段名鸡同鸭讲
kotlin
症状:JSON字段叫"user_name",Java字段叫userName
解法:@SerializedName("user_name") 贴符镇压
心魔2:空指针大魔王
javascript
症状:JSON里有null,Java对象炸成NullPointerException
解法:给字段设默认值,或者开启serializeNulls()
心魔3:日期格式错乱
vbnet
症状:
输入:{"birthday":"2023-08-15"}
报错:Caused by: java.text.ParseException
解法:请出SimpleDateFormat当护法
飞升指南( 最佳实践 )
-
统一配置:用GsonBuilder打造专属炼丹炉
-
防御编程:给所有模型类准备无参构造器(防反序列化暴毙)
-
安全第一:处理外部JSON时开启HtmlEscaping(防XSS夺舍)
-
性能调优:超大文件用JsonReader流式处理(内存管理天尊)
仙界公告:
虽然Gson以"简单佛系"闻名,但遇到以下情况请呼叫外援:
- 需要超高性能:请Jackson道友出山
- 复杂JSON结构:考虑Fastjson(但记得打安全补丁)
- 要玩JSONPath:直接请出JsonPath老神仙