在工作中因为某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类型。