版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcdef314159/article/details/89887391
在gson解析json数据的时候,如果一个int类型返回的字段为"",就会报上面的异常,如果返回的是null就没这个问题,但实际上这个字段是后端返回的,有可能改动比较大,这个时候就需要前端进行处理,解决方法很简单,就是在创建gson的时候添加几行代码就行
Gson gson = new GsonBuilder()
.registerTypeAdapter(int.class, IntTypeAdapter)
.registerTypeAdapter(Integer.class, IntTypeAdapter).create();
private static TypeAdapter<Number> IntTypeAdapter = new TypeAdapter<Number>() {
@Override
public void write(JsonWriter out, Number value) throws IOException {
out.value(value);
}
@Override
public Number read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
try {
String result = in.nextString();
if ("".equals(result)) {
return null;
}
return Integer.parseInt(result);
} catch (NumberFormatException e) {
throw new JsonSyntaxException(e);
}
}
};
如果想添加long类型还可以继续register,
Gson gson = new GsonBuilder()
.registerTypeAdapter(long.class, LongTypeAdapter)
.registerTypeAdapter(Long.class, LongTypeAdapter)
.registerTypeAdapter(int.class, IntTypeAdapter)
.registerTypeAdapter(Integer.class, IntTypeAdapter).create();
private static TypeAdapter<Number> LongTypeAdapter = new TypeAdapter<Number>() {
@Override
public void write(JsonWriter out, Number value) throws IOException {
out.value(value);
}
@Override
public Number read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
try {
String result = in.nextString();
if ("".equals(result)) {
return null;
}
return Long.parseLong(result);
} catch (NumberFormatException e) {
throw new JsonSyntaxException(e);
}
}
};
如果想要添加更多类型,可以参照上面继续添加即可。如果使用了retrofit,可以在初始化的时候添加
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(sBaseUrl)
.addConverterFactory(GsonConverterFactory.create(getGson()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(httpClient)
.build();
private static Gson getGson() {
return new GsonBuilder()
.registerTypeAdapter(long.class, LongTypeAdapter)
.registerTypeAdapter(int.class, IntTypeAdapter)
.registerTypeAdapter(Integer.class, IntTypeAdapter)
.registerTypeAdapter(Long.class, LongTypeAdapter).create();
}