本文是要解决使用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();
}