Retrofit 2.0 java.lang.IllegalStateException:预期BEGIN_ARRAY但是是STRING

时间:2015-11-17 11:19:23

标签: java android json retrofit okhttp

我在我的应用中使用了Retrofit 2.0。一切都很好,但当我开始请求时,它返回:

**java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING
at line 1 column 21 path $[0].iso**

这是我的API界面:

public interface GetPhones {
    @GET("phones.php")
    Call<ArrayList<Phones>> getPhones();
}

和模型类:

public class Phones {
    int id;
    char[] iso;
    String name;
    String phone_1;
    String phone_2;
    String phone_3;
}

和片段中的代码:

Retrofit retrofit = new Retrofit.Builder()
         .baseUrl(URL_API)
         .client(SSLSuppressClient.trustcert())
         .addConverterFactory(GsonConverterFactory.create())
         .build();
GetPhones getPhonesInfo = retrofit.create(GetPhones.class);
Call<GetPhones> call = getPhonesInfo.getPhones();
call.enqueue(new Callback<GetPhones>() {
    @Override
    public void onResponse(Response<GetPhones> response, Retrofit retrofit) {
        Toast.makeText(getActivity(), "Success!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(Throwable t) {
        Toast.makeText(getActivity(), "Failure!", Toast.LENGTH_SHORT).show();
        Log.d("LOG", t.getMessage());
                }
    });

似乎问题是在服务器端启用的gzip。但是,当我尝试使用Response代码时 - 它就像一个魅力。所以,问题不在于gzipping。

Retrofit retrofit = new Retrofit.Builder()
             .baseUrl(URL_API)
             .client(SSLSuppressClient.trustcert())
             .addConverterFactory(GsonConverterFactory.create())
             .build();
GetPhones getPhonesInfo = retrofit.create(GetPhones.class);
Call<List<com.squareup.okhttp.Response>> call = getPhonesInfo.getPhones();
call.enqueue(new Callback<List<com.squareup.okhttp.Response>>() {
        @Override
        public void onResponse(Response response, Retrofit retrofit) {
             Toast.makeText(getActivity(), "Success!", Toast.LENGTH_SHORT).show();
             Log.d("LOG", response.message());
             Log.d("LOG", response.raw().toString());
}

        @Override
        public void onFailure(Throwable t) {
             Toast.makeText(getActivity(), "Failed!", Toast.LENGTH_SHORT).show();
             Log.d("LOG", t.getMessage());
        }
});

我哪里出错了?

2 个答案:

答案 0 :(得分:2)

编辑:此答案对于Retrofit 2 +无效。
了解Retrofit 2中的新功能:http://inthecheesefactory.com/blog/retrofit-2.0/

<小时/> 在这种情况下它可能没有帮助,但我在我的一个项目中遇到了同样的问题,解决方案是将JSON转换器设置为Gson的自定义实例。

将此添加到您的Retrofit.Builder

.setConverter(new GsonConverter(new Gson()))

<小时/> 编辑:它可能与addConverterFactory()冲突。除非你需要它并且知道原因,否则我会把它拿出来。

答案 1 :(得分:1)

正如Pankaj Kumar所说 - char [] iso 就是问题所在。将类型更改为String解决了它!