如题当某个字段有数据是服务器返回的数据是int类型,没有数据时返回的""字符串,这时我们的app就很可能报错导致崩溃
比如如下两条数据
1.amount有数据时
2.amout没数据时
解决方案,只需如下4步:
1.FloatlNullAdapter这个类是处理float为空时返回-1
public class FloatlNullAdapter extends TypeAdapter<Float> {
@Override
public Float read(JsonReader reader) throws IOException {
// TODO Auto-generated method stub
if (reader.peek() == JsonToken.STRING) {
reader.skipValue(); //跳过当前
return -1f;
}
BigDecimal bigDecimal = new BigDecimal(reader.nextString());
return bigDecimal.floatValue();
}
@Override
public void write(JsonWriter writer, Float value) throws IOException {
// TODO Auto-generated method stub
writer.value(value);
}
}
2.IntNullAdapter这个类是解决int类型为空时返回0
public class IntNullAdapter extends TypeAdapter<Number> {
@Override
public void write(JsonWriter out, Number value) throws IOException {
out.value(value);
}
@Override
public Number read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
try {
return reader.nextInt();
} catch (NumberFormatException e) {
//这里解析int出错,那么捕获异常并且返回默认值,因为nextInt出错中断了方法,没有完成位移,所以调用nextString()方法完成位移。
reader.nextString();
return 0;
}
}
}
3.这里处理返回的数据
public class MyTypeAdapterFactory<T> implements TypeAdapterFactory {
@SuppressWarnings("unchecked")
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
Class<T> rawType = (Class<T>) type.getRawType();
if (rawType == Float.class || rawType == float.class) {
return (TypeAdapter<T>) new FloatlNullAdapter();
}else if (rawType == Integer.class || rawType == int.class){
return (TypeAdapter<T>) new IntNullAdapter();
}
return null;
}
}
4.最后添加到这里即可
Gson gson=new GsonBuilder().registerTypeAdapterFactory(new MyTypeAdapterFactory()).create();