【问题标题】:Retrofit -- Expected BEGIN_ARRAY but was STRING改造 -- 预期为 BEGIN_ARRAY,但为 STRING
【发布时间】:2016-01-27 10:39:12
【问题描述】:

我的响应 json 像

[{"user":"hasan","name":"hasan hamza"},{"user":"hüseyin","name":"hüseyin tırlak"}]

和我的班级一样

public class Person {
  public String user;
  public String name;
}

还有我的改造服务界面,比如

  public interface IService {
    @GET(ServiceURLs.USERS)
    Call<List<Person>> getUsers(@Path("operation") String operation);
  }

我这样称呼这个接口

    retrofit= new Retrofit.Builder()
                .baseUrl(ServiceURLs.BASE_SERVICE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
      IService service = retrofit.create(IService.class);

Call<List<Person>> response = service.getUsers(OperationEnum.SHOW.getOperation());
            response.enqueue(new Callback<List<Person>>() {
                @Override
                public void onResponse(Response<List<Person>> response, Retrofit retrofit) {
                    if (response.isSuccess()) {
                        Log.d("Size", response.body().size()+"");

                    } else {
                        // error response, no access to resource?
                    }
                }

                @Override
                public void onFailure(Throwable t) {
                    // something went completely south (like no internet connection)
                    Log.d("Error", t.getMessage());
                }
            });

当我提出这个请求时,它落在 onFailure 方法上,它说

java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 1 列路径 $ 改造处为 STRING

我该如何解决它

我的配置

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.xyz.damn"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
    compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
    compile 'com.squareup.okhttp:okhttp:2.5.0'

}

【问题讨论】:

  • public interface IService { @GET(ServiceURLs.USERS) Call> getUsers(@Path("operation") String operation,new Callback callback);您可以更新此代码并重试吗? }
  • 你的错误信息基本上是在告诉你你的反应不是你想象的那样。启用登录改造并重试。
  • mustafasevgi 我认为您的改装版本有点旧。我检查了我的代码,但仍然存在错误
  • njzk2 我知道它告诉它是什么和问题,因为它等待 { } 这种 json 启动但它以 [ ] 开头
  • 将@GET("/users") 改为@GET("users") 也可以解决问题。我也有。

标签: java android retrofit


【解决方案1】:

OP 的解决方案。

使用 ResponseBody 更改服务返回类型

 @GET(ServiceURLs.USERS)
    Call<ResponseBody> getUsers(@Path("operation") String operation);

然后

Call<LResponseBody> response = service.getUsers(OperationEnum.SHOW.getOperation());
        response.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
                if (response.isSuccess()) {
                    Log.d("Size", response.body().size()+"");
                     try {
                    String result = response.body().string();
                    Gson gson = new Gson();
                    List<LinkedTreeMap> persons = gson.fromJson(result, ArrayList.class);
                    personList = new ArrayList<>();
                    for (LinkedTreeMap person : persons) {
                        personList.add(gson.fromJson(person.toString(), Person.class));
                    }

                } else {
                    // error response, no access to resource?
                }
            }

            @Override
            public void onFailure(Throwable t) {
                // something went completely south (like no internet connection)
                Log.d("Error", t.getMessage());
            }
        });
    });

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,这是因为服务器的响应是“null”,我需要一个数组,所以我所做的就是将 null 更改为空数组 []。 最好从服务器端执行此操作,但如果不能,您必须按照this link 的建议实现另一个Converter

    class NullOnEmptyConverterFactory implements Converter.Factory {
    @Override public Converter<ResponseBody, ?> responseBody(Type type, Annotation[] 
    annotations, Retrofit retrofit) {
    final Converter<ResponseBody, ?> delegate = retrofit.nextResponseBodyConverter(this, 
    type, annotations);
    return new Converter<>() {
      @Override public void convert(ResponseBody body) {
        if (body.contentLength() == 0) return null;
        return delegate.convert(body);
         }
       };
    }
    }
    

    然后添加它:

    Retrofit retrofit = new Retrofit.Builder()
    .endpoint(..)
    .addConverterFactory(new NullOnEmptyConverterFactory())
    .addConverterFactory(GsonConverterFactory.create())
    .build();
    

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2014-08-01
      • 2015-11-26
      • 2018-03-27
      • 2015-07-24
      • 2016-06-28
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多