OkHttp /改装/ Gson:应为开始_OBJECT,但实际为BEGIN_ARRAY [重复]

zyfwsgd6  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(211)

此问题在此处已有答案

Why does Gson fromJson throw a JsonSyntaxException: Expected BEGIN_OBJECT but was BEGIN_ARRAY?(2个答案)
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY Kotlin(1个答案)
去年关闭了。
我有这个
发生错误:java.lang.需要开始_OBJECT,但在路径$的第1行第2列却是BEGIN_ARRAY
尝试从API检索数据时出错。我正在使用Retrofit、Gson和OkHttpClient。我正在尝试从字符(API:http://hp-api.herokuapp.com/api/characters/house/gryffindor)到回收站视图中。
这是我的代号,我希望你能从中找到与正在发生的事情有关的任何线索:

private void lanzarPeticion(String house) {
    loggingInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
    httpClientBuilder = new OkHttpClient.Builder().addInterceptor(loggingInterceptor);

    retrofit = new Retrofit.Builder().baseUrl("http://hp-api.herokuapp.com/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(httpClientBuilder.build())
            .build();

    WebServiceClient client = retrofit.create(WebServiceClient.class);

    Call<Data> call = client.getPersonajes(house);
    call.enqueue(new Callback<Data>() {
        @Override
        public void onResponse(Call<Data> call, Response<Data> response) {
            adapter.setPersonajes(response.body().getResults());
        }

        @Override
        public void onFailure(Call<Data> call, Throwable t) {
            Log.d("TAG1", "Error: " + t.getMessage());
        }
    });
}

我的Web服务客户端:

public interface WebServiceClient {
    @GET("characters/house/{house}")
    Call<Data> getPersonajes(@Path("house") String house);

    @GET()
    Call<Personaje> getPersonaje(@Url String url);
}

这是我的Data类(用于getResults())

public class Data {
    private String count;
    private String next;
    private List<Personaje> results;

    public String getCount() {
        return count;
    }

    public void setCount(String count) {
        this.count = count;
    }

    public String getNext() {
        return next;
    }

    public void setNext(String next) {
        this.next = next;
    }

    public List<Personaje> getResults() {
        return results;
    }

    public void setResults(List<Personaje> results) {
        this.results = results;
    }
}

myzjeezk

myzjeezk1#

发生错误:java.lang.需要开始_OBJECT,但在路径$的第1行第2列却是BEGIN_ARRAY
正如错误中明确指出的那样,您正在尝试将JSONArray解析为JSONObject

@GET("characters/house/{house}")
Call<Data> getPersonajes(@Path("house") String house);

此服务方法需要JSONObject,但根据映像中共享的logcat,响应提供的是JSONArray。您应将其解析为:

@GET("characters/house/{house}")
Call<List<Personaje>> getPersonajes(@Path("house") String house)
5hcedyr0

5hcedyr02#

这里似乎没有使用Data类的好理由(该类的通用名为“Data”的事实似乎反映了这一点),因为您正在接收多个Personaje,所以您应该接受多个Personaje

Call<List<Personaje>> getPersonajes(@Path("house") String house);

如果您使用Data类(不带List),反序列化程序将需要一个Object,因此会出现错误(Expected BEGIN_OBJECT)。如果您在Data中实现List,您 * 可能 * 能够使它工作,但当Call<List<Personaje>> getPersonajes应该工作正常时,它似乎没有任何作用。

相关问题