再封装Rx数据预和异常预处理的时候,由于为了简便性,我的DataModel字段会包含一些Json字符串没有的字段,这样就导致了JSON解析报错。大概错误就是:
image还搞得内存溢出了哟!如果去网上查相关问题不一定有这个答案。或许某些问题可以找到。 后来跟网友讨论下,当时说如果是缺少字段可以,但是如果新增了字段而Json字符串有没有该字段就不行。
然后我果断就替换为了阿里的FastJson,FastJson内部做了类似的处理,所以没有问题。简单记录下,后面看看实体类是否还可以进行二次封装,尽量都可以用。
FastJson自定义解析器如下三个文件:
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;
public class FastJsonConverterFactory extends Converter.Factory{
public static FastJsonConverterFactory create() {
return new FastJsonConverterFactory();
}
/**
* 需要重写父类中responseBodyConverter,该方法用来转换服务器返回数据
*/
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
return new FastJsonResponseBodyConverter<>(type);
}
/**
* 需要重写父类中responseBodyConverter,该方法用来转换发送给服务器的数据
*/
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return new FastJsonRequestBodyConverter<>();
}
}
FastJsonResponseBodyConverter.java
import com.alibaba.fastjson.JSON;
import java.io.IOException;
import java.lang.reflect.Type;
import okhttp3.ResponseBody;
import okio.BufferedSource;
import okio.Okio;
import retrofit2.Converter;
public class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Type type;
public FastJsonResponseBodyConverter(Type type) {
this.type = type;
}
/*
* 转换方法
*/
@Override
public T convert(ResponseBody value) throws IOException {
BufferedSource bufferedSource = Okio.buffer(value.source());
String tempStr = bufferedSource.readUtf8();
bufferedSource.close();
return JSON.parseObject(tempStr, type);
}
}
FastJsonRequestBodyConverter.java
import com.alibaba.fastjson.JSON;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Converter;
public class FastJsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
@Override
public RequestBody convert(T value) throws IOException {
return RequestBody.create(MEDIA_TYPE, JSON.toJSONBytes(value));
}
}
使用就简单:
image基本就可以了。测试了也没有问题...其实有时候我们的同一个接口根据参数值不同可能结果会不同,所以基本上我们还是定义一个datamodel比较方便,如果定义多个的话,还得自己去处理JSON数据,感觉更麻烦了。所以目前小白看还是这种比较方便。
网友评论