背景 :2台服务器存储格式情况Mark一下有2台服务A和B,redis 存储差异引发的事故
error Could not read JSON: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON
1、server-A 的 redis存储格式如下:
"{"cooperationModel":0,"feedback":1,"showStyle":0}"
postman 读取格式是 :
""{\"cooperationModel\":0,\"feedback\":1,\"showStyle\":0}""
2、server-B 的 redis存储格式如下:
{"cooperationModel":0,"feedback":2,"showStyle":0}
postman 读取格式是 :
"{"cooperationModel":0,"feedback":2,"showStyle":0}"
业务上出现的问题
开始按网上解决方案【确实server-A是这么配置】1、server-B ,数据变更都会重新redis赋值数据key,server-A会查询key是否有值存储,没有则自己去查询赋值数据key
但是如果 server-B 读取到 server-A 存储的数据报错:
error Could not read JSON: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON
按网上解决方案配置server-A1、Spring 源码中是使用容器中的ObjectMapper对象进行序列化和反序列化。当我们将自定义的 ObjectMapper 对象放入IOC 容器中后,会自动覆盖 SpringBoot 自动装载的 ObjectMapper 对象。
若是我们在自定义的ObjectMapper中设置ObjectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);属性。
那么可能会影响我们的@RequestBody反序列化 JSON 串,将配置类的
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);所以要将其 注释掉.
发现server-B的存储格式,涉及到存储对象集合时就会报错, java.lang.ClassCastException(String),
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast
to java.lang.String 还是解决不了,两边原有的线上数据又不好变动,只能暂时在 server-B这边
赋值时转义处理一下了,zaza日常Mark一下
控制台输入结果:
测试代码:
System.out.println("server-B正常存储:"+ new Gson().toJson(test));
System.out.println("输出双引号: "");
System.out.println("输出转义双引号: \"");
System.out.println("转义成server-A格式存储:"+
"""+new Gson().toJson(test).replaceAll("\"","\\"")+""");



