json对象互转问题记录(代码片段)

波子汽水yeah 波子汽水yeah     2022-12-18     171

关键词:

遇到一个神奇的问题

在项目里面前端接收的一个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的报错友好很多!

简单的性能对比

 @Test
    public 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的更快 

java对象与json字符串的互转(代码片段)

JSON字符串转普通对象普通对象转JSON字符串JSON字符串数组转List集合对象List集合对象转JSON字符串数组JSON字符串转装有对象的Map装有对象的Map转JSON字符串最近,工作中会涉及到Java对象与JSON字符串相互转换,虽然说并不难&... 查看详情

对象bean与map互转问题(代码片段)

一、摘要在实际开发过程中,经常碰到需要进行对象与map之间互转的问题,其实对于对象、Map之间进行互转有很多种方式,下面我们一起来梳理一下:利用JSON工具包,将对象转成字符串,之后再转成Map,这种需要转换2次,相对... 查看详情

json对象与字符串互转

...时,页面中代码太多,一下看不过来,于是想把页面中的对象直接复制出来,可通过JSON相关方法实现:JSON.parse(jsonstr);//可以将json字符串转换成json对象JSON.stringify(jsonobj);//可以将json对象转换成json对符串在转换字符串为对象时,... 查看详情

json串与java对象互转

Json与Bean互转,Timestamp类型的问题:http://blog.csdn.net/luckdog_hot/article/details/78808761)将java单个对象装换成json串   2)将java集合对象转换成json串   3:将json串装换成java单个对象     查看详情

java--map与实体类对象之间互转(代码片段)

一、json转换依赖阿里的FastJSon,用到的主要jar包:fastjson-1.2.54.jar1、maven引入<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54 查看详情

jsonjavabeanmapxml之间的互转(代码片段)

思路是JavaBean、Map、XML都可以用工具类很简单的转换为Json,进而实现互相转换1.Map、XML与Json互转mvn依赖<dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20171018</version 查看详情

转:json与map互转(代码片段)

转自:java中字符串,json,Map互相转换(各种转换都有)_蜗牛驿站-CSDN博客_javajson转map前提:使用jar包为fastjsonimportcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject; 程序如下:    Map 查看详情

json对象字符串互转

json对象字符串互转  1、Node.js中JSON.parse(jsonstr);//可以将json字符串转换成json对象JSON.stringify(jsonobj);//可以将json对象转换成json字符串  2、Jquery中$.parseJSON(jsonstr);//jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象  3、javaSc... 查看详情

flutter的map与string互转(存入sharedpreferences)(代码片段)

Hello,I’Shendi这里记录一下我的需求是将Map中的数据存到SharedPreferences中,下次初始化时取出来转换成MapMap与JSONObject格式差不多一致,可以直接这样创建一个MapMapm="key":"value";在Flutter中,对于JSONObject字符... 查看详情

flutter的map与string互转(存入sharedpreferences)(代码片段)

Hello,I’Shendi这里记录一下我的需求是将Map中的数据存到SharedPreferences中,下次初始化时取出来转换成MapMap与JSONObject格式差不多一致,可以直接这样创建一个MapMapm="key":"value";在Flutter中,对于JSONObject字符... 查看详情

jsonutil(java对象/list与json互转,xml与json互转)

1packagecom.chauvet.utils.json;23importjava.io.BufferedReader;4importjava.io.File;5importjava.io.FileInputStream;6importjava.io.FileWriter;7importjava.io.InputStreamReader;8importjava.util.List;910imp 查看详情

[js]javascript对象与json的互转

varobj=JSON.parse(json);//由JSON字符串转换为JSON对象varjson=JSON.stringify(obj);//将JSON对象转化为JSON字符//此种需下载插件varjson=obj.toJSONString();//将JSON对象转化为JSON字符 查看详情

json对象与json字符串互转

...持的转换方式JSON.parse(jsonstr);//可以将json字符串转换成json对象JSON.stringify(jsonobj);//可以将json对象转换成json字符串 2、jQuery插件支持的转换方式: $.parseJSON(jsonstr);//jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象  注... 查看详情

json基础(代码片段)

...的访问json的两个常用方法JSON在java中的使用javaBean和json的互转List和json的互转map和json的互转导读模块发展史:21世纪初,DouglasCrockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语... 查看详情

jsonutil(java对象/list与json互转,xml与json互转)

packagecom.chauvet.utils.json;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileWriter;importjava.io.InputStreamReader;importjava.util.List;importnet.sf.j 查看详情

js实现json和xml之互转(代码片段)

在web工程里面,可能需要经常使用到xml和web的互转功能,在这里,使用万恶的百度之后,发现用java实现效率和效果很差,json转成xml会出现一些类的头,比如<o>,<array>这类的,找了很多方法都没... 查看详情

json对象与json字符串互转

...ON(jsonstr);//jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2.浏览器支持的转换方式(Firefox,chrome,opera,safari,ie9,ie8)等浏览器:JSON.parse(jsonstr);//可以将json字符串转换成json对象 JSON.str 查看详情

json字符串对象互转

json对象,json字符串,不注意的话,很容易忽视混淆。例举几个容易混的情况1,php将变量放到input框中,通过js去读取出来的是json字符串,要想使用就要将json字段串转成json对象2,ajax返回json数据,如果请求没有设置dataType为json... 查看详情