问题描述
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
版权声明:本文为博主原创文章,转载请附上博文链接!