json对象互转问题记录
遇到一个神奇的问题
在项目里面前端接收的一个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对象互转问题记录相关推荐
- Delphi中JSon SuperObject 使用:数据集与JSON对象互转
在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...
- JSON字符串转换为JSON对象 互转函数
在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如: JSON字符串: var str1 = '{ &q ...
- php 判断json包含key,php判断json对象是否存在的方法
在实际测试中php读取json数组时 使用简单的 if 或者 array_key_exists 去判断对象是否存在是会报错的,以下是google搜寻的正确判断方法 实际上出现报错只是我对php还不是很 ...
- jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧
json:JavaScript 对象表示法(javascript Object Notation),其实JSON就是一个javaScript的对象(Object)而已. 如有不清楚JSON,可以去w3 ...
- JSON 和 JavaScript 对象互转
JSON 和 JavaScript 对象互转 要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法: var obj = JSON.parse('{" ...
- Jackson使用:String 与对象互转、Jackson 从 json 字符串转换出对象
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.从json字符串转换出对象 Pager类: import com.fasterxml.jacks ...
- JSON 和 JS 对象互转
JSON 和 JS 对象互转 要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法: var json = JSON.stringify({a: 'Hello', b: ...
- 二:C#对象、集合、DataTable与Json内容互转示例;
导航目录: Newtonsoft.Json 概述 一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型: 二:C#对象.集合.DataTable与Json内容互转示例: ...
- json对象与json字符串互转,ajax各常见函数
1.使用jquer插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2.浏览器支持的 ...
最新文章
- 后盾网lavarel视频项目---4、lavarel和vue都是{{}}表示变量,如何解决冲突
- MATLAB | matlab运行、下载链接及21个matlab基本图像调试代码
- linux 命令 全程,linux命令及全程详解
- 1.9 编程基础之顺序查找 09 直方图 9分 python
- web前端性能调优(转载)
- PHP 微信小程序支付实现
- 医院绩效考核系统设计方案
- 计算机设备运行频率单位,计算机常见计量单位解析
- 微缩脚步趋缓 摩尔定律由于EUV微影技术延迟失去动力
- 吃鸡降落伞降落,射线检测,触发销毁降落伞等
- 南京梧桐树美吗?生活在梧桐树下的痛苦,春天掉毛、夏天掉皮、秋天掉叶,一年三掉,砸的你是一把鼻涕一把泪。
- mysql on是什么意思_这SQL语句里的ON 是什么意思啊
- mysql数据字段属性
- 朋友问他是否该跳槽了?我是这么跟他说的
- DecoHack #014 独立产品灵感周刊 - 有些产品很无用但又有很有趣
- VIPS 98经济型漏电继电器
- 如何下载和安装mysql
- 打开Sql数据库文件(扩展名为mdf)
- 人工智能python自学教程-人工智能基础教程:Python篇(青少版)
- vue 项目纪念日灰白