关于fastjosn转化HashMap存储Redis引发的java.lang.ClassCastException: java.lang.Integer cannot be cast to java

本文介绍如何在Redis中存储HashMap数据而不使用序列化方式,避免类型转换异常。通过调整RedisTemplate设置并使用特定方法将Json转换为HashMap<String,String>,确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在工作中因为某PHP开发想偷懒,不想要如下这样的HashMap序列化后的数据,偏偏要第二张这样的存储数据
在这里插入图片描述
在这里插入图片描述
如第二张图所示想要这样的存储数据。面对这样的需求,只能一步步开始搞

第一步先解决redis存HhashMap不以序列化的方式存储:
在RedisUtil中加入

 @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        this.redisTemplate = redisTemplate;
    }

如图:
在这里插入图片描述

第二步由于数据中既有int又有string,需要转换为HashMap<String,String>

在这里插入图片描述
这个时候调用HashMap<String,String>mapType=JSON.parseObject(parseObject.toString(),HashMap.class);这个方法去存储到Redis中会引发java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String这个异常。

通过断点调查可以发现,根本原因在于将json的String转化出来Hashmap里面的的值还是Integer类型的,而并非是指定的HashMap<String,String>这个类型中的String类型
在这里插入图片描述为了解决Redis存储发生这个类型转换问题,调用 HashMap<String, String> params = JSONObject.parseObject(parseObject.toJSONString(), new TypeReference<HashMap<String, String>>(){});这个方法将Josn转为HashMap<String,String>这个时候实行代码可以发现问题已经解决。

在这里插入图片描述
通过断点检查进行比较可以发现里面的值已经全都转为String类型了,所以存储Redis不会发生类型转换异常的错误。
在这里插入图片描述

总结:HashMap<String,String>mapType=JSON.parseObject(parseObject.toString(),HashMap.class);这个方法会保留Json串中的值类型, HashMap<String, String> params = JSONObject.parseObject(parseObject.toJSONString(), new TypeReference<HashMap<String, String>>(){});则是会将Json串中的值类型全部转为指定的String类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值