【问题标题】:Retrofit: onFailure: Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $改造:onFailure:预期 BEGIN_OBJECT 但在路径 $ 处是 BEGIN_ARRAY
【发布时间】:2018-07-03 11:42:04
【问题描述】:

我正在使用改造和 laravel 后端 api 编写一个 android 应用程序。 我的问题是:我想用 api 找回用户,这在 chrome:inspector 中看起来很好,但 logcat 显示:onFailure: Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $

我的界面:

public interface ApiService {

    @POST("register")
    @FormUrlEncoded
    Call<AccessToken> register(@Field("name") String name, @Field("email") String email, @Field("password") String password);

    @POST("login")
    @FormUrlEncoded
    Call<AccessToken> login(@Field("username") String username, @Field("password") String password);

    @GET("users")
    Call<UserResponse> users();

}

我的响应类

import java.util.List;

public class UserResponse {

    List<User> data;

    public List<User> getData() {
        return data;
    }

我的用户模型

public class User {

    int id;
    String name;
    String email;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

还有我的 api 调用:

@OnClick(R.id.btn_get_user)
    void getUsers() {
        call = service.users();
        call.enqueue(new Callback<UserResponse>() {
            @Override
            public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {
                Log.w(TAG, "onResponse: " + response);

                if (response.isSuccessful()) {
                    username.setText(response.body().getData().get(0).getName());
                } else {
                    startActivity(new Intent(GameActivity.this, LoginActivity.class));
                    finish();
                    tokenManager.deleteToken();
                }

            }

            @Override
            public void onFailure(Call<UserResponse> call, Throwable t) {
                Log.w(TAG, "onFailure: " + t.getMessage());
            }
        });

    }

希望你能帮助我。 谢谢!

【问题讨论】:

  • 无效的 json 解析。您正在尝试将数组解析为对象。

标签: android json retrofit


【解决方案1】:

使用如下所示的“列表”广告:-

**Api interface**

公共接口 ApiService {

@POST("register")
@FormUrlEncoded
Call<List<AccessToken>> register(@Field("name") String name, @Field("email") String email, @Field("password") String password);

@POST("login")
@FormUrlEncoded
Call<List<AccessToken>> login(@Field("username") String username, @Field("password") String password);

@GET("users")
Call<List<UserResponse>> users();

}

api 调用:

@OnClick(R.id.btn_get_user)
    void getUsers() {
        call = service.users();
        call.enqueue(new Callback<List<UserResponse>>() {
            @Override
            public void onResponse(Call<List<UserResponse>> call, Response<List<UserResponse>> response) {
                Log.w(TAG, "onResponse: " + response);

                if (response.isSuccessful()) {
                    username.setText(response.body().getData().get(0).getName());
                } else {
                    startActivity(new Intent(GameActivity.this, LoginActivity.class));
                    finish();
                    tokenManager.deleteToken();
                }

            }

            @Override
            public void onFailure(Call<List<UserResponse>> call, Throwable t) {
                Log.w(TAG, "onFailure: " + t.getMessage());
            }
        });

    }

【讨论】:

  • 但是当我想访问数据时它会给我一个空指针异常:(
  • 如果您收到响应但没有收到 response.body(),您可以通过打印 response.code() 来检查错误代码,或者现在您可以通过 response.body().get(0 ).getName()
  • 我试过这个 response.body().get(0).getName(),但它说 getName() 无法解析 response.code() 返回 200
  • 好吧,我得到了我的初始错误......在我的 laravel api 中,我返回了 response()->json($users) 而不是 response()->json(['data'= >$users])
【解决方案2】:

您应该检查您从后端 api 发送的 json。可能您正在从后端 api 发送一个对象以进行 @GET("users") api 调用,但您想将其响应解析为 List&lt;User&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多