栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

error Could not read JSON: Unexpected token (START

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

error Could not read JSON: Unexpected token (START

Mark一下有2台服务A和B,redis 存储差异引发的事故
error Could not read JSON: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON

背景 :2台服务器存储格式情况

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}"

业务上出现的问题

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-A是这么配置】

1、Spring 源码中是使用容器中的ObjectMapper对象进行序列化和反序列化。当我们将自定义的 ObjectMapper 对象放入IOC 容器中后,会自动覆盖 SpringBoot 自动装载的 ObjectMapper 对象。
若是我们在自定义的ObjectMapper中设置ObjectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);属性。
那么可能会影响我们的@RequestBody反序列化 JSON 串,将配置类的
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);所以要将其 注释掉.

按网上解决方案配置server-A

发现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("\"","\\"")+""");

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999152.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号