0
点赞
收藏
分享

微信扫一扫

Caused by: java.lang.NumberFormatException: empty String

在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();
}


举报

相关推荐

0 条评论