Gson解析空字符串异常的处理
⾯对⼀些不规范的json,我们的gson解析经常会抛出各种异常导致app崩溃,这⾥可以采取⼀些措施来避免。
我们期望在后台返回的json异常时,也能解析成功,空值对应的转换为默认值,如:newsId=0;
这⾥排除掉后台开发⼈员输出时给你做矫正,还是得靠⾃⼰啊---
我们写⼀个针对int值的类型转换器,需要实现Gson的JsonSerializer<T>接⼝和JsonDeserializer<T>,即序列化和反序列化接⼝public class IntegerDefault0Adapter implements JsonSerializer<Integer>, JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
空字符串是什么
if (AsString().equals("") || AsString().equals("null")) {
//定义为int类型,如果后台返回""或者null,则返回0
return0;
}
} catch (Exception ignore) {
}
try {
AsInt();
} catch (NumberFormatException e) {
throw new JsonSyntaxException(e);
}
}
@Override
public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src);
}
}
同理Long类型
public class LongDefault0Adapter implements JsonSerializer<Long>, JsonDeserializer<Long> {
@Override
public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
if (AsString().equals("") || AsString().equals("null")) {
//定义为long类型,如果后台返回""或者null,则返回0
return0;
}
} catch (Exception ignore) {
}
try {
AsLong();
} catch (NumberFormatException e) {
throw new JsonSyntaxException(e);
}
}
@Override
public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src);
}
}
同理Double类型
public class DoubleDefault0Adapter implements JsonSerializer<Double>, JsonDeserializer<Double> {
@Override
public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
if (AsString().equals("") || AsString().equals("null")) {
//定义为double类型,如果后台返回""或者null,则返回0.00
return0.00;
}
} catch (Exception ignore) {
}
try {
AsDouble();
} catch (NumberFormatException e) {
throw new JsonSyntaxException(e);
}
}
@Override
public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src);
}
}
使⽤⽅法
return new Retrofit.Builder()
.client(okHttpClient)//设置⽹络访问框架
.ate(buildGson()))//添加json转换框架
.ate())//让Retrofit⽀持RxJava
.baseUrl(baseUrl)
.build();
/**
* 增加后台返回""和"null"的处理
* 1.int=>0
* 2.double=>0.00
* 3.long=>0L
*
* @return
*/
public static Gson buildGson() {
if (gson == null) {
gson = new GsonBuilder()
.registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
.registerTypeAdapter(int.class, new IntegerDefault0Adapter())
.registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
.registerTypeAdapter(double.class, new DoubleDefault0Adapter())
.registerTypeAdapter(Long.class, new LongDefault0Adapter())
.registerTypeAdapter(long.class, new LongDefault0Adapter())
.create();
}
return gson;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论