fastjson整型数值问题


class Bean {

        private Long aLong;

        public Long getaLong() {
            return aLong;
        }

        public void setaLong(Long aLong) {
            this.aLong = aLong;
        }
    }


    /**
     * fastjson根据整型数值的大小反序列化
     * 如果数值大小在int范围内, 就用integer反序列化;
     * 如果数值大小超过int范围, 就用Long反序列化;
     * <p>
     * 不管json字符串中整型的数值大小是在int范围还是在long范围,用long类型来接收, 总不会错的;
     * <p>
     * 但是如果是在反序列化的是Integer类型的数值,把Integer强转成Long肯定要抛出异常的;
     * <p>
     * 为了避免异常, 先把数值转成字符串, 然后再用
     * Long.valueOf(String.valueOf(map.get("aLong")));
     * <p>
     * <p>
     * <p>
     * test1:验证fastjson根据整型数值大小决定反序列化后的整型类型是Integer还是Long
     * <p>
     * Long到Long
     */
    @Test
    public void test1() {

        long l = Long.valueOf(String.valueOf(Integer.MAX_VALUE)) + 1;

        //[{"aLong":2147483648},{"aLong":2147483648},{"aLong":2147483648}]
        List<Bean> beans = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Bean bean = new Bean();
            bean.setaLong(l);
            beans.add(bean);
        }

        String beansJson = JSON.toJSONString(beans);

        System.out.println(beansJson);


        List<Map> list = JSON.parseArray(beansJson, Map.class);

        for (Map map : list) {
            Long aLong = Long.valueOf(String.valueOf(map.get("aLong")));
            System.out.println(aLong);
        }

    }


    /**
     * Integer 到 Long
     */
    @Test
    public void test2() {

        List<Bean> beans = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Bean bean = new Bean();
            bean.setaLong(Long.valueOf(i));
            beans.add(bean);
        }

        String beansJson = JSON.toJSONString(beans);

        List<Map> list = JSON.parseArray(beansJson, Map.class);

        for (Map map : list) {
            Long aLong = Long.valueOf(String.valueOf(map.get("aLong")));
            System.out.println(aLong);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值