把一段 JSON 字符串还原成一个实体对象
这三行代码的作用是:
把一段 JSON 字符串还原成一个 Shop
实体对象,但中间经过了一层自定义的包装类型 RedisData
。
逐行拆开讲你就明白了。
- RedisData redisData = JSONUtil.toBean(shopJson, RedisData.class);
1.1JSONUtil.toBean(...)
是 Hutool 提供的 JSON→对象工具。
1.2 它把字符串shopJson
整体反序列化成RedisData
类型的对象。
1.3RedisData
一般是咱们项目里自己写的类,长这样(简化版):
public class RedisData {private Object data; // 真正业务数据(这里存的是 Shop)private Long expireTime; // 逻辑过期时间,可选// getter/setter …
}
此时 redisData.getData()
拿到的是 Object 类型,实际上里面是一个 JSONObject
。
- JSONObject data = (JSONObject) redisData.getData();
2.1 把Object
强转成 Hutool 的JSONObject
,方便下一步再解析。
2.2 为什么能强转?
因为序列化时就是把Shop
先转成JSONObject
再塞进RedisData
,所以反序列化后这里一定是JSONObject
实例。
- Shop shop = JSONUtil.toBean(data, Shop.class);
3.1 再把JSONObject
二次解析成真正的业务实体Shop
。
3.2 完成后shop
就是一个完整的Shop
对象,可以正常用它做后续业务逻辑。
一张图看懂流程:
shopJson(String)│▼
RedisData(外壳)│▼
JSONObject(内胆)│▼
Shop(真实业务对象)
常见坑提醒
- 如果
redisData.getData()
实际不是JSONObject
(比如是字符串或数组),强转会抛ClassCastException
。 - 建议加一行非空判断:
if (redisData == null || redisData.getData() == null) {return null;
}
一句话总结
“拆两层包装”:先把 JSON 字符串还原成带过期时间的 RedisData
,再把里面的数据二次解析成最终要用的 Shop
对象。