fastjson踩坑

项目场景:

数据序列化后反序列化实现数据copy


问题描述

提示:fastjson序列化后反序列化异常。版本:1.2.83

序列化数据模型:

class SC implements Serializable {
        private List<String> afield;
        private List<List<String>> zfield;

        public List<String> getAfield() {
            return afield;
        }

        public void setAfield(List<String> afield) {
            this.afield = afield;
        }

        public List<List<String>> getZfield() {
            return zfield;
        }

        public void setZfield(List<List<String>> zfield) {
            this.zfield = zfield;
        }
    }

注意:List的属性名必须先于List<List>属性(afield < zfield)。

测试代码:

@Test
    public void testSc() {
        SC sc = new SC();
        sc.setAfield(Arrays.asList("a", "b"));
        sc.setZfield(Arrays.asList(sc.getAfield()));
        String s = JSONUtils.toJSONString(sc);
        System.out.println(s);
        // excption:
        JSONUtils.parseObject(s, SC.class);
    }

s输出的信息: 

{"afield":["a","b"],"zfield":[{"$ref":"$.afield"}]}

在进行反序列化的时候会异常:

com.alibaba.fastjson.JSONException: field 0 expect '[', but {, pos 31, line 1, column 32{"afield":["a","b"],"zfield":[{"$ref":"$.afield"}]}


原因分析:

提示:fastjson 的bug

List的属性名必须先于List<List>属性(afield < zfield),fastjson会优先对afield序列化,后面序列化的属性会引用同样对象。


解决方案:

提示:1、更换版本,目前只在1.2.83版本复现。

        2、禁止循环依赖

String s = JSONUtils.toJSONString(sc, SerializerFeature.DisableCircularReferenceDetect);

禁止循环依赖序列化的结果:

{"afield":["a","b"],"zfield":[["a","b"]]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值