Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 抛出自定义错误以进行改装2_Android_Rx Java_Retrofit2_Moshi - Fatal编程技术网

Android 抛出自定义错误以进行改装2

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

我正试图使用这个代码段来抛出自定义api错误,使用Moshi

API的回报是:

  • {“错误”:“消息”}
  • {“失败”:“消息”}
  • {“成功”:“消息”}
  • {…}
  • [{…},{…},…]
HTTP代码始终为200

我的改装界面是:

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)