RedisTemplate序列化存储的数据包含转移字符导致json转对象失败j

3 篇文章 0 订阅

在项目中中使用RedisTemplate序列化对象存储时,将转义字符""也存到redis里面,再次取出时,转成对象失败。据同事说是序列化方式不一致导致的。在此记录一下,也感谢一下同事的帮助。
在此之前看一下存入的代码:

List<String> listData = //数据;
SessionCallback callback = new SessionCallback() {
      @Override
       public Object execute(RedisOperations operations) throws DataAccessException {
           operations.multi();
           operations.boundHashOps(getAllMapeKey()).putAll(mapData);                          operations.boundListOps(geAlltKey()).leftPushAll(array);
           return operations.exec();
       }
   };
   try {
       SpringContextUtils.getBean(RedisTemplate.class).execute(callback);
       notificationMapCurrent.clear();
   } catch (Exception e) {
       logger.error("保存数据至redis失败,", e);
   }

这样

SpringContextUtils.getBean(RedisTemplate.class).execute(callback); 

执行之后保存到redis里面的数据是

"{\"infoIds\":\"220191216210101161250616126\",\"Time\":1576501218000}"

这样的数据取出来时的string就保持了原样,
使用一下方式获取:

@Autowired
private RedisTemplate<String,String> redisTemplate;
BoundHashOperations<String, String, String> boundHashOperations = redisTemplate.boundHashOps(getAllMapeKey());

将去到的string数据转换为对象,就会导致直接转换成json是报错:

com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0, fastjson-version 1.2.62

但是,如果使用的是StringRedisTemplate就可以。

SpringContextUtils.getBean(StringRedisTemplate.class).execute(callback); 

执行之后保存到redis里面的数据是:

{"infoIds":"220191216210101161250616126","Time":1576501218000}"

至于原因可能是,RedisTemplate和StringRedisTemplate序列化范式不一样导致的:

RedisTemplate使用的是 JdkSerializationRedisSerializer 序列化对象,可以用来存储对象,但是要实现Serializable接口。

StringRedisTemplate使用的是 StringRedisSerializer 序列化String,StringRedisTemplate 主要用来存储字符串,StringRedisSerializer的泛型指定的是String。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值