解决 Gson int自动转double问题

本文是要解决使用Gson,后端返回的int或者long类型,会自动转为double。
具体原理就不多说了,网上有很多,有兴趣的小伙伴可以去看 TypeAdapter 和 ObjectTypeAdapter。
这里使用的 Gson版本为 2.10.1,如果没有 setObjectToNumberStrategy 方法,请升级Gson版本。

使用Retrofit结合Gson情况

 /**
     * 第一步:构建gson,解决int自动转double问题
     * @return
     */
    public Gson buildGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setObjectToNumberStrategy(ToNumberPolicy.LAZILY_PARSED_NUMBER);

        //这种也可以解决
//        gsonBuilder.setObjectToNumberStrategy(new ToNumberStrategy() {
//            @Override
//            public Number readNumber(JsonReader in) throws IOException {
//                JsonToken token = in.peek();
//                switch (token) {
//                    case NUMBER:
//                        /**
//                         * 改写数字的处理逻辑,将数字值分为整型与浮点型。
//                         */
//                        double dbNum = in.nextDouble();
//
//                        // 数字超过long的最大值,返回浮点类型
//                        if (dbNum > Long.MAX_VALUE) {
//                            return dbNum;
//                        }
//                        // 判断数字是否为整数值
//                        long lngNum = (long) dbNum;
//                        if (dbNum == lngNum) {
//                            try {
//                                return (int) lngNum;
//                            } catch (Exception e) {
//                                return lngNum;
//                            }
//                        } else {
//                            return dbNum;
//                        }
//
//                    case NULL:
//                        in.nextNull();
//                        return null;
//
//                    default:
//                        throw new IllegalStateException("Unexpected token: " + token);
//                }
//            }
//        });
        return gsonBuilder.create();

    }

/**
     * 第二步:
     * 
     */
 Retrofit.Builder()
   .baseUrl(baseUrl)
   //重点是这一步使用
   .addConverterFactory(GsonConverterFactory.create(buildGson()))
   .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //rxjava 适配器
   .build();			

不使用Retrofit

//直接构建Gson就行
public Gson buildGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setObjectToNumberStrategy(ToNumberPolicy.LAZILY_PARSED_NUMBER);

        //这种也可以解决
//        gsonBuilder.setObjectToNumberStrategy(new ToNumberStrategy() {
//            @Override
//            public Number readNumber(JsonReader in) throws IOException {
//                JsonToken token = in.peek();
//                switch (token) {
//                    case NUMBER:
//                        /**
//                         * 改写数字的处理逻辑,将数字值分为整型与浮点型。
//                         */
//                        double dbNum = in.nextDouble();
//
//                        // 数字超过long的最大值,返回浮点类型
//                        if (dbNum > Long.MAX_VALUE) {
//                            return dbNum;
//                        }
//                        // 判断数字是否为整数值
//                        long lngNum = (long) dbNum;
//                        if (dbNum == lngNum) {
//                            try {
//                                return (int) lngNum;
//                            } catch (Exception e) {
//                                return lngNum;
//                            }
//                        } else {
//                            return dbNum;
//                        }
//
//                    case NULL:
//                        in.nextNull();
//                        return null;
//
//                    default:
//                        throw new IllegalStateException("Unexpected token: " + token);
//                }
//            }
//        });
        return gsonBuilder.create();

    }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值