很简单的一个列表序列化,升级之后居然序列化出来
"amount": {
"$ref": "$[0].amount"
},
类似这种,导致线上事故!!
应该是有循环引用吧,SerializerFeature.DisableCircularReferenceDetect
使用fastjson就是看中了它的"$ref"特性
序列化出来的文本一堆$ref 还是标准的JSON格式吗? 能和其他json序列化框架通用吗?
可以避免json攻击,防止出现stackOverFlow异常 也有部分json框架支持的
遵守JSON格式标准,这是最基本的要求。最基本的都做不到,要来干啥
给你带来麻烦,很抱歉。这样设计,是因为早期遇到很多反馈是因为循环引用报错,引入这个特性,对有些人是帮助,对你这种情况就是麻烦。如上面的同学所回答的那样,可以用SerializerFeature.DisableCircularReferenceDetect 解决你的问题。每个库都有自己的问题的,使用fastjson你遇到问题,很快就有人给你解决办法,如果有bug,我也会尽快提供修复方案。
抱歉,我的语气过重,当时确实正在气头上,跟作者道歉。不过因为fastjson导致的线上问题这的确不是第一次了。1.2.7版本序列化丢失数据就造成过一次严重线上故障,现在换成jackson工作量代价都非常大,因为fastjson序列化出来的结果有的是不兼容标准json格式的。
关于1.2.7丢失数据的说明我单独贴出来:
public static void main(String[] args) {
List<ConditionGroupPreferentialPair> conditionGroupPreferentialPairs = Lists.newArrayList();
ConditionGroupModel cg = new ConditionGroupModel();
cg.setConditionGroupDesc("condition group");
List<ConditionModel> conditionModels = Lists.newArrayList();
ConditionModel c1 = new ConditionModel();
c1.setDesc("condition");
DiscountCardRangeConditionModel c2 = new DiscountCardRangeConditionModel();
c2.setDiscountCardIdSet(Sets.newHashSet(1, 2));
conditionModels.add(c1);
conditionModels.add(c2);
cg.setConditionModels(conditionModels);
SettlePriceAndSellPricePreferentialModel pre = new SettlePriceAndSellPricePreferentialModel();
pre.setPreferentialDesc("preferential");
pre.setPriceConfig(new SettlePriceAndSellPricePreferentialModel.PriceConfig());
conditionGroupPreferentialPairs.add(ConditionGroupPreferentialPair.of(cg,pre));
conditionGroupPreferentialPairs.add(ConditionGroupPreferentialPair.of(cg,pre));
String json = JSONHelper.toJSONString(conditionGroupPreferentialPairs);
JSONArray jsonArray = JSONArray.parseArray(json);
for(int i=0;i<jsonArray.size();i++){
JSONObject jsonObject =jsonArray.getJSONObject(i);
System.out.println(jsonObject.toJSONString());
}
}
正确的结果是
{"preferentialModel":{"id":0,"preferentialType":0,"preferentialDesc":"preferential","status":0,"priceConfig":{}},"conditionGroupModel":{"id":0,"conditionModels":[{"id":0,"desc":"condition","status":0,"conditionType":0},{"id":0,"status":0,"conditionType":0,"discountCardIdSet":[1,2]}],"status":0,"preferentialId":0,"conditionGroupDesc":"condition group"}}
{"preferentialModel":{"id":0,"preferentialType":0,"preferentialDesc":"preferential","status":0,"priceConfig":{}},"conditionGroupModel":{"id":0,"conditionModels":[{"id":0,"desc":"condition","status":0,"conditionType":0},{"id":0,"status":0,"conditionType":0,"discountCardIdSet":[1,2]}],"status":0,"preferentialId":0,"conditionGroupDesc":"condition group"}}
可是1.2.7 的结果却是
{"preferentialModel":{"id":0,"preferentialType":0,"preferentialDesc":"preferential","status":0,"priceConfig":{}},"conditionGroupModel":{"id":0,"conditionModels":[{"id":0,"desc":"condition","status":0,"conditionType":0},{"id":0,"status":0,"conditionType":0,"discountCardIdSet":[1,2]}],"status":0,"preferentialId":0,"conditionGroupDesc":"condition group"}}
{"conditionGroupModel":{"id":0,"conditionModels":[{"id":0,"desc":"condition","status":0,"conditionType":0},{"id":0,"status":0,"conditionType":0,"discountCardIdSet":[1,2]}],"status":0,"preferentialId":0,"conditionGroupDesc":"condition group"}}
第二行json的preferentialModel数据部分被错误丢失!
此外各种小问题,也有很多,有序列化处理不是json格式的,有内存泄露的,比如因为安全问题升级最新版之后,对空字符串的序列化之后居然完全没有任何数据,都不是json格式了。导致前端解析json出错。。。。等等。这个库确实问题非常多。
请问数据丢失的问题解决了没有?正确版本是什么?能否提供ConditionGroupPreferentialPair的类结构信息,从你提供的代码无法重现问题。
质量是fastjson很关注的问题,有大约3700多个回归测试,每次发布都会回归,阿里绝大部分Java应用都用fastjson,如果质量出问题,在内部也会产生故障。
被使用越广泛,遇到的场景就会越多,也越容易遇到问题,不能保证完全没问题,遇到问题反馈过来,我会尽快响应并修复。
1.2.12 版本丢失数据的问题修复了。
需要类结构复现问题的话,可以留个邮箱给我
使用了DisableCircularReferenceDetect,会使context为null,如果这是设计问题也无可厚非,但是还会导致存在循环引用时发生StackOverflowError,我想这也是默认开启检测的原因,另外大部分人使用DisableCircularReferenceDetect是为了解决重复引用会以$ref形式表示对前端不友好的问题。所以建议循环引用和重复引用应区别对待。
Most helpful comment
请问数据丢失的问题解决了没有?正确版本是什么?能否提供ConditionGroupPreferentialPair的类结构信息,从你提供的代码无法重现问题。
质量是fastjson很关注的问题,有大约3700多个回归测试,每次发布都会回归,阿里绝大部分Java应用都用fastjson,如果质量出问题,在内部也会产生故障。
被使用越广泛,遇到的场景就会越多,也越容易遇到问题,不能保证完全没问题,遇到问题反馈过来,我会尽快响应并修复。