当前位置: 首页 > news >正文

【Bug经验分享】由jsonObject-TypeReference引发的序列化问题

报错

fastjson.JSONException: syntax error, expect {, actual string

背景

InnerResult<Map<Long, Price>> categoryAttributeRequiredSPMResp = JsonUtil.convertJSONString2Object(res, new TypeReference<InnerResult<Map<Long, Price>>>() { });

在这段代码中会出现反序列化 "异常",转换不了Price对象,在之前的测试中一直都是这种方式使用的,也可以转换为Price对象但是,突然在某一天生产上抛出了异常,定位后发现是在这里出现了类型转换异常,复杂对象序列化为json字符串之后,反序列化的时候异常,明明类型是对的,但是就是转换失败,详细代码如下:

public Map<Long, Price> listPriceByIds(List<Long> productIds) {if (CollectionUtils.isEmpty(productIds)) {return new HashMap<>();}String url = spmUrl + "/supplier-product-self-built-product/purchase-price";try {String res = HttpUtils.postBody(url, "json", JSON.toJSONString(productIds));logger.info("获取SPM采购价格,traceId={},请求地址={},请求参数={},响应={}", SwapAreaUtils.getSwapArea().get(Constant.TRACE_KEY), url, JSON.toJSONString(productIds), res);InnerResult<Map<Long, Price>> categoryAttributeRequiredSPMResp = JsonUtil.convertJSONString2Object(res, new TypeReference<InnerResult<Map<Long, Price>>>() {});if (!categoryAttributeRequiredSPMResp.getCode().equals(0)) {return new HashMap<>();}return categoryAttributeRequiredSPMResp.getData();} catch (Exception e) {logger.error("获取SPM采购价格,traceId={},请求地址={},请求参数={}", SwapAreaUtils.getSwapArea().get(Constant.TRACE_KEY), url, JSON.toJSONString(productIds));logger.error("获取SPM采购价格接口失败", e);return new HashMap<>();}
}
/*** 将json串转换为类型为className的对象.* 处理如下json:{'field1':1,'field2':'a'}** @param <T>        类型参数* @param jsonString json字符串* @param type       TypeReference<T>* @return 对象*/
public static <T> T convertJSONString2Object(String jsonString, TypeReference<T> type) {return JSON.parseObject(jsonString, type);
}

修复

public Map<Long, Price> listPriceByIds(List<Long> productIds) {if (CollectionUtils.isEmpty(productIds)) {return new HashMap<>();}String url = spmUrl + "/supplier-product-self-built-product/purchase-price";try {String res = HttpUtils.postBody(url, "json", JSON.toJSONString(productIds));logger.info("获取SPM采购价格,traceId={},请求地址={},请求参数={},响应={}", SwapAreaUtils.getSwapArea().get(Constant.TRACE_KEY), url, JSON.toJSONString(productIds), res);InnerResult<JSONObject> innerResult = JsonUtil.convertJSONString2Object(res, new TypeReference<InnerResult<JSONObject>>() {});if (!innerResult.getCode().equals(0)) {return new HashMap<>();}Map<Long, Price> resultMap = new HashMap<>();for (Map.Entry<String, Object> entry : innerResult.getData().entrySet()) {Price price = JSON.parseObject(JSON.toJSONString(entry.getValue()), Price.class);if (price != null) {resultMap.put(Long.valueOf(entry.getKey()), price);}}return resultMap;} catch (Exception e) {logger.error("获取SPM采购价格,traceId={},请求地址={},请求参数={}", SwapAreaUtils.getSwapArea().get(Constant.TRACE_KEY), url, JSON.toJSONString(productIds));logger.error("获取SPM采购价格接口失败", e);return new HashMap<>();}
}

主要是先将返回值转为 JSONObject 对象,其次取出key,value后自行组装Map这样是稳妥解决了这个类型转换的异常



反思


在定位这个问题的时候,就从来没想过这边会出现问题,因为代码是完全没有动过的,理论上不会有问题,打日志定位后 发现 但是 很鬼畜的事情就是突然发生 类型转换异常,那为什么之前从来没出现过这个问题,怀疑是 alibaba.fastjson 这个包下的TypeReference 序列化 多多少少是有Bug的,不知道是不是版本不稳定引起的--  后面再看看吧

http://www.lryc.cn/news/618500.html

相关文章:

  • 【昇腾】关于Atlas 200I A2加速模块macro0配置3路PCIE+1路SATA在hboot2中的一个bug_20250812
  • STM32_bug总结(TIM定时中断进不去和只进1次)
  • 高性能web服务器Nginx
  • 【Android】【bug】Json解析错误Expected BEGIN_OBJECT but was STRING...
  • linux 开机进入initramfs无法开机
  • 跨设备开发不再难:HarmonyOS 分布式任务管理应用全解析
  • 《Fast Automatic White Balancing Method by Color Histogram Stretching》论文笔记
  • 让齿轮与斑马线共舞:汽车文化驿站及安全教育基地的展陈实践
  • 农业智慧大屏系统 - Flask + Vue实现
  • 安全合规5--终端安全检测和防御技术
  • Python初学者笔记第二十二期 -- (JSON数据解析)
  • 【智慧城市】2025年湖北大学暑期实训优秀作品(3):基于WebGIS的南京市古遗迹旅游管理系统
  • 机器学习 [白板推导](十)[马尔可夫链蒙特卡洛法]
  • js高阶-总结精华版
  • [ 数据结构 ] 时间和空间复杂度
  • 机器学习之TF-IDF文本关键词提取
  • 机器学习-决策树(上)
  • HCIP项目之OSPF综合实验
  • 《算法导论》第 21 章-用于不相交集合的数据结构
  • Linux下命名管道和共享内存
  • django celery 动态添加定时任务后不生效问题
  • 自建知识库,向量数据库 体系建设(二)之BERT 与.NET 8
  • “生成式UI革命”:Tambo AI如何让你的应用“开口说话、动手搭界面” | 全面深剖、案例实践与未来展望
  • 深度学习自动并行技术:突破计算瓶颈的智能调度艺术
  • 每日任务day0812:小小勇者成长记之挤牛奶
  • 13-docker的轻量级私有仓库之docker-registry
  • Dataset类案例 小土堆Pytorch入门视频记录
  • 【Vue.js】生产设备规划工具(报价单Word文档生成)【开发全流程】
  • [TryHackMe]Internal(hydra爆破+WordPress主题修改getshell+Chisel内网穿透)
  • 在Colab上复现LoRA相关论文实验的完整指南