Android 抛出自定义错误以进行改装2
我正试图使用这个代码段来抛出自定义api错误,使用Moshi API的回报是:Android 抛出自定义错误以进行改装2,android,rx-java,retrofit2,moshi,Android,Rx Java,Retrofit2,Moshi,我正试图使用这个代码段来抛出自定义api错误,使用Moshi API的回报是: {“错误”:“消息”} {“失败”:“消息”} {“成功”:“消息”} {…} [{…},{…},…] HTTP代码始终为200 我的改装界面是: public interface NewsService { /** * Get all news * * @return */ @GET("getActualites.php") Observable
{“错误”:“消息”}
{“失败”:“消息”}
{“成功”:“消息”}
{…}
[{…},{…},…]
public interface NewsService {
/**
* Get all news
*
* @return
*/
@GET("getActualites.php")
Observable<List<News>> loadNews();
}
我不知道为什么Moshi看到的是对象的泛型类型而不是数组数据的数据类型应该是
List
而不是t
是的,看起来你有一个JSON数组。你的JSON是什么样子的?data
的数据类型应该是List
而不是T
是的,看起来你有一个JSON数组。您的JSON看起来像什么?
public final class ApiResponse<T> {
String failure;
String error;
String success;
T data;
public ApiResponse(String failure, String error, T data) {
this.failure = failure;
this.error = error;
this.data = data;
}
public ApiResponse(T data) {
this.data = data;
}
static class FailureException extends RuntimeException {
public final String error;
public FailureException(String error) {
super("Error message : " + error.getMsg());
this.error = error;
}
}
}
public class ApiErrorHandlerFactory extends Converter.Factory {
public ApiErrorHandlerFactory() {
}
public static Converter.Factory create() {
return new ApiErrorHandlerFactory();
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
Type envelopeType = Types.newParameterizedType(ApiResponse.class, type);
return new ResponseEnvelopeConverter<>(retrofit.nextResponseBodyConverter(this, envelopeType, annotations));
}
private static class ResponseEnvelopeConverter<T> implements Converter<ResponseBody, T> {
private final Converter<ResponseBody, ApiResponse<T>> delegate;
ResponseEnvelopeConverter(Converter<ResponseBody, ApiResponse<T>> delegate) {
this.delegate = delegate;
}
@Override
public T convert(ResponseBody value) throws IOException {
ApiResponse<T> envelope = delegate.convert(value);
if (envelope.failure != null) {
throw new ApiResponse.FailureException(envelope.failure);
}
if (envelope.error != null) {
throw new ApiResponse.FailureException(envelope.error);
}
if (!TextUtils.isEmpty(envelope.success)) {
Timber.d("Success response : %s", envelope.success);
}
return envelope.data;
}
}
}
com.squareup.moshi.JsonDataException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $
at com.squareup.moshi.JsonUtf8Reader.beginObject(JsonUtf8Reader.java:140)
at com.squareup.moshi.ClassJsonAdapter.fromJson(ClassJsonAdapter.java:155)
at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:127)
at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:34)
at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:42)
at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:25)
at fr.mummyz.core.moshi.handler.ApiErrorHandlerFactory$ResponseEnvelopeConverter.convert(ApiErrorHandlerFactory.java:45)
at fr.mummyz.core.moshi.handler.ApiErrorHandlerFactory$ResponseEnvelopeConverter.convert(ApiErrorHandlerFactory.java:36)
at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:118)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:212)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)