这三行代码的作用是:
把一段 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 对象。
1万+

被折叠的 条评论
为什么被折叠?



