遇到一个神奇的问题

在项目里面前端接收的一个string类型的json转换成对象的时候报错

cn.hutool.core.convert.ConvertException: No Converter for type [java.util.List]

然后不服气的我拿出来研究了一下,结果发现在新建的工程里面没有问题。这就很尴尬了。本着不不服气的精神,又研究了好久,把实体类拷出来一模一样还是报错。既然实体都一样了。猛然想起。两个工程用的hutool包版本不一致。最后把测试工程的hutool包降级版本后问题就重现。项目里hutool包 4.5.11测试工程里面5.3.10版本

记录一下,踩了这个坑

   String txt ="{\"logType\":4,\"beInviterPrizePoolId\":1298,\"updateCode\":\"191095846\",\"theMax4ShareReward\":\"完成本阶梯任务数量\",\"inviteRules\":[{\"helpTarget\":[{\"eventType\":\"member\",\"event\":154,\"eventBody\":[{\"branch_name\":\"分支名称\",\"event\":[{\"column_name\":\"register_area\",\"column_value\":\"110101\",\"meta_column_id\":2175,\"column_value_type\":\"field\",\"web_value\":\"{\\\"province\\\":[\\\"11\\\"],\\\"city\\\":[\\\"1101\\\"],\\\"region\\\":[\\\"110101\\\"]}\"},{\"column_name\":\"register_store_manager_code\",\"column_value\":\"C-P101-A155-M0374-B1855-DDTT01\",\"meta_column_id\":2176,\"column_value_type\":\"field\",\"column_value_ext\":{\"table_name\":\"cdp_store_imp\",\"column_name_select\":\"org_code_long\",\"column_name_where\":[\"batch_no\",\"brand_code\"],\"where_value\":[\"\",\"TS\"]},\"web_value\":\"{\\\"bigAreas\\\":\\\"C\\\",\\\"smallAreas\\\":\\\"C-P101\\\",\\\"managerAreas\\\":\\\"C-P101-A155\\\",\\\"managerCityAreas\\\":\\\"C-P101-A155-M0374\\\",\\\"operateCities\\\":\\\"\\\",\\\"storeItems\\\":\\\"C-P101-A155-M0374-B1855-DDTT01\\\",\\\"selectedStoreItems\\\":[{\\\"orgCode\\\":\\\"DDTT01\\\",\\\"orgName\\\":\\\"DDTT01-1\\\",\\\"orgCodeLong\\\":\\\"C-P101-A155-M0374-B1855-DDTT01\\\"}]}\"},{\"column_name\":\"register_time\",\"column_value\":\"@2021-08-26 00:00:00,2021-08-27 23:59:59\",\"meta_column_id\":2177,\"column_value_type\":\"field\"},{\"column_name\":\"register_source\",\"column_value\":\"offline\",\"meta_column_id\":2178,\"column_value_type\":\"enum2Filter\",\"column_value_ext\":{\"offline\":[\"03\",\"11\",\"19\",\"48\",\"27\",\"31\",\"09\",\"07\"]}}]}],\"helpTargetName\":\"助力任务描述\"}],\"countWithInviter\":true,\"finishThisLadderNum\":\"完成本阶梯任务数量\",\"thisLadderPrizePoolId\":1298,\"ladderImg\":\"https://crm-resource-test.topsports.com.cn/group1/M00/08/32/Cgn72WEKSCeAWLyyAAABS4B__A8285.png\",\"sendTimeType\":0,\"sendTimeVal\":\"\"}],\"actModel\":3,\"updateUser\":\"闫凯梦\",\"inviteType\":3,\"freezeTime\":\"2021-08-18 00:00:00\",\"beInviterCanGetMaxLimit\":\"可获得奖励次数\",\"activityId\":\"26ccc8b7c23b42669c0f795d2e4e070c\",\"sharePrizePoolId\":1298,\"logOperationType\":1}";ActRuleConfigDto actRuleConfigDto =  JSONUtil.toBean(txt, ActRuleConfigDto.class);System.out.println("======"+JSONUtil.toJsonStr(actRuleConfigDto));

查明原因,因为实体里面定义的字段theMax4ShareReward是int类型传入的是string 报了这个错。被这个报错【No Converter for type [java.util.List]】误导了。

测试工程里面 JSON.toJsonString(actRuleConfigDto) 报错了

java.lang.ClassCastException: cn.hutool.core.bean.PropDesc cannot be cast to cn.hutool.core.bean.BeanDesc$PropDesc
奇怪的时,当我搞明白版本这个问题居然不报错了 猜测还是包版本的问题。

另外推荐一个好用的json解析工具

<dependency><groupId>org.noear</groupId><artifactId>snack3</artifactId><version>3.1.18</version><scope>provided</scope></dependency>String jsonStr ="{\"code\":1,\"data\":{\"claimNum\":1,\"couponCodes\":[\"这是一个测试券号忽略\"],\"couponList\":[{\"couponCode\":\"这是一个测试券号忽略\",\"endTime\":\"2021-08-31 23:59:59\",\"startTime\":\"2021-08-05 00:00:00\",\"ticketPassword\":\"\",\"ticketUrl\":\"\"}],\"couponRuleCode\":\"HTDT21029679\",\"couponRuleName\":\"xxx九折优惠券051\",\"couponType\":1,\"couponTypeSub\":11,\"discType\":1,\"faceMoney\":10,\"message\":\"领取成功\",\"showFinishFlag\":0,\"vipFlag\":false},\"bizMsg\":\"成功\",\"bizCode\":20000}";ONode o = ONode.load(jsonStr);o.set("bizCode",2);System.out.println(o.select("$.bizCode"));ONode data = o.select("$.data");JSONObject couponInfo = new JSONObject();couponInfo.put("couponRuleName",data.select("$.couponRuleName").getString());couponInfo.put("couponMoneyType",data.select("$.discType").getString());couponInfo.put("couponMoney",data.select("$.faceMoney").getString());couponInfo.put("isretail",data.select("$.couponType").getInt());couponInfo.put("startTime",data.select("$.couponList[0].startTime").getString());couponInfo.put("endTime",data.select("$.couponList[0].endTime").getString());couponInfo.put("showFinishFlag",data.select("$.showFinishFlag").getInt());couponInfo.put("couponCode",data.select("$.couponList[0].couponCode").getString());System.out.println(JSON.toJSONString(couponInfo));System.out.println(o.get("data").get("couponList").get(0).get("couponCode"));// string转对象ActRuleConfigDto  actRuleConfigDto2 = ONode.deserialize(txt,ActRuleConfigDto.class);System.out.println("字符串化:"+ONode.stringify(actRuleConfigDto2));System.out.println("序列化="+ONode.serialize(actRuleConfigDto2));

上面类型不对的json用ONode 转对象的时候会报错

java.lang.RuntimeException: java.lang.NumberFormatException: For input string: "完成本阶梯任务数量"
这个就比hutool的报错友好很多!

简单的性能对比

 @Testpublic void tests(){String txt ="{\"logType\":4,\"beInviterPrizePoolId\":1298,\"updateCode\":\"191095846\",\"theMax4ShareReward\":3,\"inviteRules\":[{\"helpTarget\":[{\"eventType\":\"member\",\"event\":154,\"eventBody\":[{\"branch_name\":\"分支名称\",\"event\":[{\"column_name\":\"register_area\",\"column_value\":\"110101\",\"meta_column_id\":2175,\"column_value_type\":\"field\",\"web_value\":\"{\\\"province\\\":[\\\"11\\\"],\\\"city\\\":[\\\"1101\\\"],\\\"region\\\":[\\\"110101\\\"]}\"},{\"column_name\":\"register_store_manager_code\",\"column_value\":\"C-P101-A155-M0374-B1855-DDTT01\",\"meta_column_id\":2176,\"column_value_type\":\"field\",\"column_value_ext\":{\"table_name\":\"cdp_store_imp\",\"column_name_select\":\"org_code_long\",\"column_name_where\":[\"batch_no\",\"brand_code\"],\"where_value\":[\"\",\"TS\"]},\"web_value\":\"{\\\"bigAreas\\\":\\\"C\\\",\\\"smallAreas\\\":\\\"C-P101\\\",\\\"managerAreas\\\":\\\"C-P101-A155\\\",\\\"managerCityAreas\\\":\\\"C-P101-A155-M0374\\\",\\\"operateCities\\\":\\\"\\\",\\\"storeItems\\\":\\\"C-P101-A155-M0374-B1855-DDTT01\\\",\\\"selectedStoreItems\\\":[{\\\"orgCode\\\":\\\"DDTT01\\\",\\\"orgName\\\":\\\"DDTT01-1\\\",\\\"orgCodeLong\\\":\\\"C-P101-A155-M0374-B1855-DDTT01\\\"}]}\"},{\"column_name\":\"register_time\",\"column_value\":\"@2021-08-26 00:00:00,2021-08-27 23:59:59\",\"meta_column_id\":2177,\"column_value_type\":\"field\"},{\"column_name\":\"register_source\",\"column_value\":\"offline\",\"meta_column_id\":2178,\"column_value_type\":\"enum2Filter\",\"column_value_ext\":{\"offline\":[\"03\",\"11\",\"19\",\"48\",\"27\",\"31\",\"09\",\"07\"]}}]}],\"helpTargetName\":\"助力任务描述\"}],\"countWithInviter\":true,\"finishThisLadderNum\":4,\"thisLadderPrizePoolId\":1298,\"ladderImg\":\"https://crm-resource-test.topsports.com.cn/group1/M00/08/32/Cgn72WEKSCeAWLyyAAABS4B__A8285.png\",\"sendTimeType\":0,\"sendTimeVal\":\"\"}],\"actModel\":3,\"updateUser\":\"闫凯梦\",\"inviteType\":3,\"freezeTime\":\"2021-08-18 00:00:00\",\"beInviterCanGetMaxLimit\":9,\"activityId\":\"26ccc8b7c23b42669c0f795d2e4e070c\",\"sharePrizePoolId\":1298,\"logOperationType\":1}";long start  = System.currentTimeMillis();for (int i =0;i<100000;i++){ActRuleConfigDto  actRuleConfigDto2 = ONode.deserialize(txt,ActRuleConfigDto.class);
//           String res =ONode.stringify(actRuleConfigDto2);}long end = System.currentTimeMillis();System.out.println("ONode序列化耗时1="+(end-start));long start2  = System.currentTimeMillis();for (int i =0;i<100000;i++){ActRuleConfigDto actRuleConfigDto =  JSONUtil.toBean(txt, ActRuleConfigDto.class);
//           String res =com.alibaba.fastjson.JSONObject.toJSONString(actRuleConfigDto);}long end2 = System.currentTimeMillis();System.out.println("ONode序列化耗时2="+(end2-start2));
//        ONode序列化耗时1=1073
//        ONode序列化耗时2=1497//去掉反序列化 仅 str转对象  性能好了快一倍
//        ONode序列化耗时1=699
//        ONode序列化耗时2=1339}

ONode性能好了快一倍。但是对象转str的时候hutool的更快

json对象互转问题记录相关推荐

  1. Delphi中JSon SuperObject 使用:数据集与JSON对象互转

    在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...

  2. JSON字符串转换为JSON对象 互转函数

    在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如: JSON字符串: var str1 = '{ &q ...

  3. php 判断json包含key,php判断json对象是否存在的方法

    在实际测试中php读取json数组时 使用简单的 if 或者 array_key_exists 去判断对象是否存在是会报错的,以下是google搜寻的正确判断方法 实际上出现报错只是我对php还不是很 ...

  4. jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧

    json:JavaScript 对象表示法(javascript Object Notation),其实JSON就是一个javaScript的对象(Object)而已. 如有不清楚JSON,可以去w3 ...

  5. JSON 和 JavaScript 对象互转

    JSON 和 JavaScript 对象互转 要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法: var obj = JSON.parse('{" ...

  6. Jackson使用:String 与对象互转、Jackson 从 json 字符串转换出对象

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.从json字符串转换出对象 Pager类: import com.fasterxml.jacks ...

  7. JSON 和 JS 对象互转

    JSON 和 JS 对象互转 要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法: var json = JSON.stringify({a: 'Hello', b: ...

  8. 二:C#对象、集合、DataTable与Json内容互转示例;

    导航目录: Newtonsoft.Json 概述 一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型:    二:C#对象.集合.DataTable与Json内容互转示例: ...

  9. json对象与json字符串互转,ajax各常见函数

    1.使用jquer插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2.浏览器支持的 ...

最新文章

  1. 后盾网lavarel视频项目---4、lavarel和vue都是{{}}表示变量,如何解决冲突
  2. MATLAB | matlab运行、下载链接及21个matlab基本图像调试代码
  3. linux 命令 全程,linux命令及全程详解
  4. 1.9 编程基础之顺序查找 09 直方图 9分 python
  5. web前端性能调优(转载)
  6. PHP 微信小程序支付实现
  7. 医院绩效考核系统设计方案
  8. 计算机设备运行频率单位,计算机常见计量单位解析
  9. 微缩脚步趋缓 摩尔定律由于EUV微影技术延迟失去动力
  10. 吃鸡降落伞降落,射线检测,触发销毁降落伞等
  11. 南京梧桐树美吗?生活在梧桐树下的痛苦,春天掉毛、夏天掉皮、秋天掉叶,一年三掉,砸的你是一把鼻涕一把泪。
  12. mysql on是什么意思_这SQL语句里的ON 是什么意思啊
  13. mysql数据字段属性
  14. 朋友问他是否该跳槽了?我是这么跟他说的
  15. DecoHack #014 独立产品灵感周刊 - 有些产品很无用但又有很有趣
  16. VIPS 98经济型漏电继电器
  17. 如何下载和安装mysql
  18. 打开Sql数据库文件(扩展名为mdf)
  19. 人工智能python自学教程-人工智能基础教程:Python篇(青少版)
  20. vue 项目纪念日灰白

热门文章

  1. docker 自制CentOS 6-lnp镜像
  2. java 提取xml中数据_Java中xml中数据的读取
  3. Anaconda FreeCAD安装
  4. 看了这篇文章之后,英语考研绝对没有问题
  5. 设计师别浪费时间啦,快来试试这款Sketch标注插件吧
  6. 当我问 ChatGPT 能否推荐一下好用的 API 管理工具时?
  7. ArcGIS加载WMTS服务错误
  8. 4、Qt设备识别(简单的密钥生成器)
  9. linux 卸载32位rar,让CentOS能用yum自动安装rar和unrar
  10. 图片怎么合成gif动图?操作步骤详解