改造:onFailure:预期为BEGIN_OBJECT,但在路径$处为BEGIN_ARRAY

时间:2018-07-03 11:42:05

标签: android json retrofit

我正在使用改造和laravel后端api编写一个android应用程序。 我的问题是:我想用api找回用户,因为它在chrome:inspector中看起来不错,但是logcat显示: onFailure:预期为BEGIN_OBJECT,但在路径$ 上为BEGIN_ARRAY >

我的界面:

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());
            }
        });

    }

希望您能帮助我。 谢谢!

2 个答案:

答案 0 :(得分: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());
            }
        });

    }

答案 1 :(得分:0)

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