FastJson对Object对象的解析问题

FastJson中JSONObject的全面用法与常用方法详解 阅读详情

问题描述

ActivityRuleBase 基础类,ActivityRuleUserVo,ActivityRulePayTypeVo 继承ActivityRuleBase 类

public class Activity implements Serializable {

	private Long id;  //
	private String name;  //活动名称
	private List<Object> ActivityRuleList;//实际可能是多个不同类实例,eg:cRule,dRule
//setting,getting
}

Activity 数据json字符串解析成对象实例数据时,如下是无法实现的,即便是加上了TypeReference子类的特有数据仍然会丢失

Activity sv2 = JSON.parseObject(text, Activity.class);
        System.out.println(JSON.toJSONString(sv2));
[{"condition":"11111","ruleType":"USER_RULE"},{"payType":"22222","ruleType":"PAY_TYPE_RULE"}]
USER_RULE={"condition":"11111","ruleType":"USER_RULE"}
PAY_TYPE_RULE={"payType":"22222","ruleType":"PAY_TYPE_RULE"}
json解析结果----------------------------------------------------
{"activityRuleList":[{"condition":"11111","ruleType":"USER_RULE"},{"payType":"22222","ruleType":"PAY_TYPE_RULE"}],"name":"ces","status":1}
USER_RULE={"ruleType":"USER_RULE"}
PAY_TYPE_RULE={"ruleType":"PAY_TYPE_RULE"}
{"activityRuleList":[{"ruleType":"USER_RULE"},{"ruleType":"PAY_TYPE_RULE"}],"name":"ces","status":1}

看解析的结果,子类的自有属性值并没有解析处来,只有父类的属性值。

解决办法

fastJson源码可以看到对于ArrayList的默认的反序列化器是CollectionCodec,另外fastjson还提供了@JSONField注解对field可以有一些自定义的处理,其deserializeUsing属性可以指定具体的反序列化器。我们要做的就很简单了。

public class ActivitiyRuleVoDeserializer extends CollectionCodec {

    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        T list = super.deserialze(parser, type, fieldName);
        JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(list));
        ArrayList<ActivityRuleBase> debtVOs = new ArrayList<>();

        for(int i=0;i<jsonArray.size();i++){
            // 遍历 jsonarray 数组,把每一个对象转成 json 对象
            JSONObject jsob = jsonArray.getJSONObject(i);
            // 得到 每个对象中的属性值
            System.out.println(jsob.get("ruleType")+"="+JSON.toJSONString(jsob)) ;

            switch (RuleType.valueOf(jsob.get("ruleType").toString())) {
                case USER_RULE://USER_RULE 用户限制规则
                    ActivityRuleUserVo activityRuleUser = JSON.parseObject(JSON.toJSONString(jsob),ActivityRuleUserVo.class);
                    debtVOs.add(activityRuleUser);
                    break;
                case PAY_TYPE_RULE://PAY_TYPE_RULE支付方式
                    ActivityRulePayTypeVo activityRulePayProm = JSON.parseObject(JSON.toJSONString(jsob),ActivityRulePayTypeVo.class);
                    debtVOs.add(activityRulePayProm);
                    break;
                case DISCOUNT_RULE://打折活动
                    ActivityRuleDiscountVo activityRuleDiscount = JSON.parseObject(JSON.toJSONString(jsob),ActivityRuleDiscountVo.class);
                    debtVOs.add(activityRuleDiscount);
                    break;
            	// 其他活动规则省略
                default:
                    ActivityRuleBase activityRuleBase  = JSON.parseObject(JSON.toJSONString(jsob),ActivityRuleBase.class);
                    debtVOs.add(activityRuleBase);
            }


        }



   /*     if (jsonArray != null && jsonArray.size()>0){

            for (:
            jsonArray) {

            }


            if (jsonArray.getJSONObject(0).get("totalEarning")!=null){
                ArrayList<CreditorDebtVO> creditorDebtVOList = (ArrayList<CreditorDebtVO>)JSON.parseArray(JSON.toJSONString(list),CreditorDebtVO.class);
                return (T)creditorDebtVOList;
            } else if (jsonArray.getJSONObject(0).get("overdueOtherFee")!=null){
                ArrayList<ObligorDebtVO> obligorDebtVOList = (ArrayList<ObligorDebtVO>)JSON.parseArray(JSON.toJSONString(list),ObligorDebtVO.class);
                return (T)obligorDebtVOList;
            }
        } else {
            return list;
        }*/

        return (T)debtVOs;
    }
}

在要解析的类的setting方法上加上如下注解

 @JSONField(deserializeUsing = ActivitiyRuleVoDeserializer.class)
    public void setActivityRuleList(List<Object> activityRuleList) {
        ActivityRuleList = activityRuleList;
    }

测试方法

   public static void main(String[] args) {

        ActivityVo sv = new ActivityVo();
        sv.setStatus(1).setName("ces");
        List<ActivityRuleBase> activityRuleList = Lists.newArrayList();//实际可能是多个


        ActivityRuleUser activityRuleUser1 = new ActivityRuleUser();
        activityRuleUser1.setRuleType("USER_RULE");
        activityRuleUser1.setCondition("11111");

        ActivityRulePayType activityRulePayProm1 = new ActivityRulePayType();
        activityRulePayProm1.setRuleType("PAY_TYPE_RULE");
        activityRulePayProm1.setPayType("22222");


        activityRuleList.add(activityRuleUser1);
        activityRuleList.add(activityRulePayProm1);

        sv.setActivityRuleList(activityRuleList);

        ParserConfig parserConfig = new ParserConfig() {
            @Override
            public ObjectDeserializer getDeserializer(Type type) {
                if (type == ActivityRuleUser.class) {
                    return super.getDeserializer(ActivityRuleUser.class);
                }
                return super.getDeserializer(type);
            }
        };


        String text1 = JSON.toJSONString(activityRuleList);
        System.out.println(text1);

        JSONArray jsonArray = JSON.parseArray(text1);

        for(int i=0;i<jsonArray.size();i++){
            // 遍历 jsonarray 数组,把每一个对象转成 json 对象
            JSONObject jsob = jsonArray.getJSONObject(i);
            // 得到 每个对象中的属性值
            System.out.println(jsob.get("ruleType")+"="+JSON.toJSONString(jsob)) ;
        }
        System.out.println("json解析结果----------------------------------------------------") ;


        String text = JSON.toJSONString(sv);
        System.out.println(text);

        Activity sv2 = JSON.parseObject(text, Activity.class);
        System.out.println(JSON.toJSONString(sv2));


    }

打印出来的数据

[{"condition":"11111","ruleType":"USER_RULE"},{"payType":"22222","ruleType":"PAY_TYPE_RULE"}]
USER_RULE={"condition":"11111","ruleType":"USER_RULE"}
PAY_TYPE_RULE={"payType":"22222","ruleType":"PAY_TYPE_RULE"}
json解析结果----------------------------------------------------
{"activityRuleList":[{"condition":"11111","ruleType":"USER_RULE"},{"payType":"22222","ruleType":"PAY_TYPE_RULE"}],"name":"ces","status":1}
USER_RULE={"condition":"11111","ruleType":"USER_RULE"}
PAY_TYPE_RULE={"payType":"22222","ruleType":"PAY_TYPE_RULE"}
{"activityRuleList":[{"condition":"11111","ruleType":"USER_RULE","toAllUser":false},{"payType":"22222","ruleType":"PAY_TYPE_RULE"}],"name":"ces","status":1}

参考资料

FastJson对泛型解析问题
https://blog.youkuaiyun.com/u011535541/article/details/80492091
版权声明:本文为博主原创文章,转载请附上博文链接!

使用FastJson将Json字符串解析为对象 Fastjson的用法一、介绍漏洞描述:影响版本安全版本二、依赖三、语法对象转jsonjson转对象 一、介绍 近日,阿里云应急响应中心监测到fastjson爆发新的反序列化远程代码执行漏洞,黑客利用漏洞,可绕过autoType限制,直接远程执行任意命令攻击服务器,风险极大。 漏洞描述: fastjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕 阅读详情

相关推荐

泛微E9/Ecode开发避坑:前端传集合参数,后端为啥总收到‘[object Object]‘?

本文深入解析泛微E9/Ecode开发中前端传递集合参数时后端接收'[object Object]'的常见问题,揭示JavaScript与Java类型系统差异导致的根本原因,并提供前后端双重转换的完整解决方案。通过代码示例详细说明如何正确序列化observable对象、处理JSON字符串,以及不同泛微版本的适配策略,帮助开发者高效解决参数传递难题。

weixin_42520796的博客 412

FastJson中的JSONObject的常用方法总结,JSONObject与java对象的转换,java对象与JSONObject的转换,利用JSONObject来深度克隆对象

FastJson中的JSONObject的常用方法总结,JSONObject与java对象的转换,java对象与JSONObject的转换,利用JSONObject来深度克隆对象 maven项目中的依赖包: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId>

杜盟恩的博客 3289

fastJson解析字符串,并转为java对象

要解析的JSON字符串 { "errcode": 0, "errmsg": "ok", "result": { "auto_add_user": true, "dept_id": 35, "dept_permits": [], "extention": "{\"faceCount\":\"657\"}", "hide_dept": false, "name": "layman", "user_permits": [] }, "request_id": "iyptirsm

会者定离,一期一祈 7234

fastjson(JSONObject、JSONArray)使用及相互转换

fastjson(JSONObject、JSONArray)使用及相互转换

kimi 1万+

Fastjson 解析不固定key

end

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 942

【FastJSON】FastJSON解析超大json的危害,以及流式解析

最近遇到一个问题,别人的一个程序,发现有一段代码要进行数据解析,字符串转java对象。代码中有这样的一解析,然后小数据量是没问题的,但是这一次出问题了,原因是这个json行数高达100万行,大概有8万个对象。本地调试的时候,代码会直接在这一点卡死,一动不动的。然后本地查看内存的时候会嗖一下内存从150M,上升到2.5G。由此可见大json解析是多么耗费内存。而且程序运行起来会不停的full GC。

九师兄 659

将Object类对象转为对应实体类对象

【Java】将Object类对象转为对应实体类对象

hustur的博客 3万+

PS/Ai/PR/AE等adobe出现正版弹窗提示:Your non-genuine Adobe app will be disabled soon解决办法

就是用专门的清理工具下载,清理工具在文章下方。然后新建三个空的记事本文件,重命名为 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。在该文件目录中,分别找到 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe,然后在防火墙入站规则里,阻止Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。

Q82556499的博客 1万+

FastJson的使用

JSONObject.parseArray(String str,转换类型.class);JSONObject.parseObject(String str,转换类型.class);JSONOBject对象.toJavaObject(转换类型.class);//返回一个Object类型对象。JSONArray对象.toJavaList(转换类型.class);//返回一个JSONOBject对象。parseObject(String str ,转换类型.class)字符传变对象。

m0_74939967的博客 1252

Coze知识库搭建:智能化管理与高效检索实践

知识管理系统是现代企业信息资产管理的核心基础设施,其核心原理是通过结构化存储和智能检索技术实现知识的快速流转。在技术实现上,基于NLP的语义理解引擎和知识图谱构建是关键,能够显著提升检索准确率和知识关联性。以Coze平台为例,其针对中文场景优化的分词算法和多模态处理能力,可有效解决技术文档管理中的术语识别和格式兼容问题。这类系统在开发团队知识沉淀、新员工培训等场景中价值显著,特别是当集成RBAC权限模型和自动化备份策略后,既能保障信息安全,又能实现持续的知识迭代。通过合理配置同义词扩展和权重调整,可使搜索命

weixin_29041195的博客 260

ChromeOS安装教程

ChromeOS,是基于Linux内核研发的ChromiumOS开源系统的闭源系统,最大的特色就是内置了Chrome浏览器,早期主要以Web云端应用程序为主,后来逐渐引入了Android子系统和Linux子系统。本文主要简述摸索的家用笔记本安装ChromeOS安装方法,供各位玩机朋友参考。

weixin_45751495的博客 8109

阿里fastjson使用问题,目前使用的2.0.6版本 illegal

使用fastjson解析JSON出现illegal,原因是不能强转为string,需要进行

fori1的博客 4750

使用FSL对DTI数据进行预处理

在fsl官网我们可以看到是同时使用了AP和PA图像处理,采用的是最小二乘法将2个图像合并为1个图像。–inindex此处需要处理的是PA图像,在acq_param.txt中我们是把这个放在第一行的,此处为1,如果处理的是AP图像,则此处为2。为了校正磁场引起的畸变,对DTI的B0像分别采集了A>P和P>A的反向编码的两种B0像。即如果AP和PA只有1个B0像时,那么这里就是两行,如果各有3个B0像则这里应该是6行。假设转换后的图像为sub01_AP.nii.gz和sub01_PA.nii.gz。

weixin_52073820的博客 4839

FastJson解析对象后验签失败问题分析

摘要:项目对接第三方服务时遇到JSON解析问题导致验签失败。主要问题:1)FastJson解析后参数顺序改变;2)null值字段被自动去除。解决方案:1)使用FastJson的Feature.OrderedField保持参数顺序;2)改用Jackson解析器保留null值字段。通过添加Jackson依赖确保数据完整性和顺序一致性,解决了验签失败问题。

雅俗共赏的博客 1203

Claude Code 错误解决方案 使用策略拒绝 Usage Policy refusal

摘要:本文分析了Claude Code API请求被拒绝的问题,当违反Usage Policy时会显示错误提示。根因包括请求内容违规、模型敏感度差异或历史消息影响。解决方案包括修改请求措辞、切换至Sonnet 4.5模型或开启新会话。文章详细追踪了错误链路,提供了核心代码分析,并给出验证方法和最佳实践建议,帮助用户避免触发API拒绝机制。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 968

fastjson解析JSON数据乱序导致的问题

本文作者:合肥工业大学 电子商务研究所 钱洋 email:1563178220@qq.com 。 内容可能有不到之处,欢迎交流。 未经本人允许禁止转载。 文章目录问题背景 问题背景 在编写网络爬虫时,经常要处理JSON数据。其中,针对JSON字符串,可利用fastjson将其转化成JSON对象,例如: JSONObject jsonfile = JSONObject.parseObject(sta...

qy20115549的博客 4233

基于Transformer模型实现交通流量时序预测(PyTorch版)

Transformer模型,作为一种基于自注意力机制的深度学习模型,最初在自然语言处理领域取得了突破性进展,其出色的长距离依赖关系捕捉能力使其在处理时序数据时也表现出色。将Transformer模型应用于交通流量时序预测,可以充分利用其优势,实现对交通流量更加精准、高效的预测。

时序笔记 2569

fastjson解析数据后导致顺序改变问题

开发过程中遇到一个问题,服务器经过排序返回后的字符串数据使用fastjson解析后,数据顺序发生变化,引起业务异常。 解决办法: 1、解析时增加参数不调整顺序 JSONObject respondeBodyJson = JSONObject.parseObject(jsonStr, Feature.OrderedField); 2、初始化json对象为有序对象: JSONObject retObj = new JSONObject(true); 这样生成的json对象就与放入数据时一致。

图图小淘气的博客 2356

分享一个完整的KANO问卷(包含正反问题和选项设置)

本文介绍了KANO模型问卷的设计与应用,用于评估功能需求优先级。问卷包含基本信息、功能评估(正反问题设计)、界面评估及开放问题,选项定义明确(如"非常喜欢"到"很不喜欢")。数据清洗规则包括剔除矛盾回答和注意力检验。通过量化编码和矩阵分析,将需求分为魅力型、期望型、必备型等类别。示例数据显示健康监测为必备型(72%),电子围栏为期望型(45%),适老化改造为无差异型(38%)。该模型为产品决策提供客观量化依据。

从技术实践立足,从项目管理方法论延伸思考 1794

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

fastjson 构建和解析json对象

maven依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.66</version> </dependency> //构建 json ...

weixin_37562241的博客 1996

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

FastJson

FastJson 是阿里巴巴开源的高性能 JSON 处理库,在 Java 环境下提供了对象与 JSON 文本之间的快速转换能力。本文通过一个完整的 Demo,演示 FastJson 在 JavaBean、JSONObject、JSONArray 以及 JSON 文本之间的相互转换。本文通过一个完整的 Demo 演示了 FastJson 在 JavaBean、JSONObject、JSONArray 以及 JSON 文本之间的相互转换。

ywl470812087的博客 13万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java fastjson2 解析JSON用法解析

你可以为Fastjson2设置自定义的日期格式,通过配置。// 设置自定义日期格式 SerializeConfig config = new SerializeConfig();// 将日期对象转换为 JSON 字符串 String jsonString = JSON . toJSONString(date , config);// 输出: 2025-01-13 14:30:00 } }

cheng_ji的专栏 2329

Object对象转实体对象,java对象转json

spring报错: No converter found for return value of type: class java.util.ArrayList spring是没有将ArrayList转换成json的转换器的,需要导入json依赖。 <!--jackson依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId&

weixin_43975276的博客 1万+

Alibaba Fastjson——超好用的JOSN解析库

System.out.println(“姓名:”+array2.get(i).getName()+“, 年龄:”+array2.get(i).getAge()+“, 地址:”+array2.get(i).getCity());System.out.println(“姓名:”+array2.get(i).getName()+“, 年龄:”+array2.get(i).getAge()+“, 地址:”+array2.get(i).getCity());

2501_90468762的博客 1798

Fastjson

Fastjson是一个高性能的Java JSON库,由阿里巴巴集团开发和维护。Fastjson提供了一种简单而强大的方式来处理JSON数据,包括序列化、反序列化和操作JSON对象。它利用Java自带的反射机制来解析JSON字符串,可以将JSON字符串转换成Java对象,或者将Java对象转换成JSON字符串。注意事项安全性问题:尽管Fastjson在性能上表现出色,但在处理JSON数据时仍需要注意安全性问题。特别是其AutoType功能的安全性问题较为突出,因此在使用时需要谨慎。

刘皇叔说Java的博客 2956
上一篇: 分库分表
下一篇: mysql主从复制实操
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值