FastJson对Object对象的解析问题

问题描述

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.csdn.net/u011535541/article/details/80492091
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值