redis Could not read JSON: Unexpected character (‘¬‘ (code 172)): expected a valid value (JSON St
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
首先说说,我碰到这个情况
我有个老项目是spring mvc的 然后用的redis 版本是1.6.2的版本,这个项目在使用中,所以redis里面存了很多登录缓存,,然后我又开了一个新项目,但是登陆是通用数据库,新项目是springboot的 用的redis是2.0.6的
那么问题出来了 Could not read JSON: Unexpected character ('¬' (code 172)) 这个异常通常是说的序列化失败
先看看springMVC的配置
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnFactory" />
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"></bean>
</property>
<!--开启事务 -->
<!--<property name="enableTransactionSupport" value="true"></property>-->
</bean>
keySerializer 的序列化 使用的是 StringRedisSerializer
valueSerializer 的序列化 使用的是 JdkSerializationRedisSerializer
那么在看看springboot的配置
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
keySerializer 的序列化 使用的是 stringRedisSerializer
valueSerializer 的序列化 使用的是 jackson2JsonRedisSerializer
那么问题来了,value 的序列化方式不一样 所以我们需要更改一下
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(jdkSerializationRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(jdkSerializationRedisSerializer);
template.afterPropertiesSet();
return template;
}
都改成jdk序列化方式就没问题啦
但是,经过我的测试 我又发现了一个新的问题
首先在存入mvc 中 redis 数据的时候 我存的是对象 ,然后在boot中取的时候是取不出来的,因为包名不匹配,所以记得在redis中不要存对象,一定要先把对象序列化成json
JSON.toJSONString(对象);
这里使用的是 阿里的 com.alibaba.fastjson.JSON 包
然后取出的时候 可以反序列化成对象
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 天前 )
960b763e
2 个月前
8c391e04
5 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)