Get запрос в Retrofit2

Использую Retrofit2 для получения json данных отсюда. При запуске метода onCreate(в котором и выполняется запрос) выводит тост из onFailure. Подскажите где не так я поступил?

MainActivity

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar_main);
    setSupportActionBar(toolbar);
    ListView listViewMain = findViewById(R.id.list_view_main);

    final TextView tvLogin, tvName, tvId;
    tvId = findViewById(R.id.user_id);
    tvName = findViewById(R.id.user_name);
    tvLogin = findViewById(R.id.user_login);

    NetworkService.getInstance().usersAPI().getUsers().enqueue(new Callback<UserClass>() {
        @Override
        public void onResponse(Call<UserClass> call, Response<UserClass> response) {
            UserClass userClass = response.body();

            tvLogin.append(userClass.getLogin());
            tvName.append(userClass.getHtmlUrl());

        }

        @Override
        public void onFailure(Call<UserClass> call, Throwable t) {
            Toast.makeText(MainActivity.this, "Не получилось", Toast.LENGTH_SHORT).show();
        }
    });
}

NetworkServise

public class NetworkService {
    private static NetworkService networkService;
    private static String BASE_URL = "https://api.github.com";
    private Retrofit retrofit;

    private NetworkService () {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static NetworkService getInstance() {
        if (networkService == null) {
            networkService = new NetworkService();
        }
        return networkService;
    }

    public UsersAPI usersAPI(){
        return retrofit.create(UsersAPI.class);
    }

}

Интерфейс usersApi

public interface UsersAPI {
@GET("/users")
Call<UserClass> getUsers();

}

И класс UserClass, который используется в интерфейсе (с помощью сайта jsonschema2pojo)

public class UserClass {
@SerializedName("login")
@Expose
private String login;
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("node_id")
@Expose
private String nodeId;
@SerializedName("avatar_url")
@Expose
private String avatarUrl;
@SerializedName("gravatar_id")
@Expose
private String gravatarId;
@SerializedName("url")
@Expose
private String url;
@SerializedName("html_url")
@Expose
private String htmlUrl;
@SerializedName("followers_url")
@Expose
private String followersUrl;
@SerializedName("following_url")
@Expose
private String followingUrl;
@SerializedName("gists_url")
@Expose
private String gistsUrl;
@SerializedName("starred_url")
@Expose
private String starredUrl;
@SerializedName("subscriptions_url")
@Expose
private String subscriptionsUrl;
@SerializedName("organizations_url")
@Expose
private String organizationsUrl;
@SerializedName("repos_url")
@Expose
private String reposUrl;
@SerializedName("events_url")
@Expose
private String eventsUrl;
@SerializedName("received_events_url")
@Expose
private String receivedEventsUrl;
@SerializedName("type")
@Expose
private String type;
@SerializedName("site_admin")
@Expose
private Boolean siteAdmin;

public String getLogin() {
    return login;
}

public void setLogin(String login) {
    this.login = login;
}

public Integer getId() {
    return id;
}

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

public String getNodeId() {
    return nodeId;
}

public void setNodeId(String nodeId) {
    this.nodeId = nodeId;
}

public String getAvatarUrl() {
    return avatarUrl;
}

public void setAvatarUrl(String avatarUrl) {
    this.avatarUrl = avatarUrl;
}

public String getGravatarId() {
    return gravatarId;
}

public void setGravatarId(String gravatarId) {
    this.gravatarId = gravatarId;
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public String getHtmlUrl() {
    return htmlUrl;
}

public void setHtmlUrl(String htmlUrl) {
    this.htmlUrl = htmlUrl;
}

public String getFollowersUrl() {
    return followersUrl;
}

public void setFollowersUrl(String followersUrl) {
    this.followersUrl = followersUrl;
}

public String getFollowingUrl() {
    return followingUrl;
}

public void setFollowingUrl(String followingUrl) {
    this.followingUrl = followingUrl;
}

public String getGistsUrl() {
    return gistsUrl;
}

public void setGistsUrl(String gistsUrl) {
    this.gistsUrl = gistsUrl;
}

public String getStarredUrl() {
    return starredUrl;
}

public void setStarredUrl(String starredUrl) {
    this.starredUrl = starredUrl;
}

public String getSubscriptionsUrl() {
    return subscriptionsUrl;
}

public void setSubscriptionsUrl(String subscriptionsUrl) {
    this.subscriptionsUrl = subscriptionsUrl;
}

public String getOrganizationsUrl() {
    return organizationsUrl;
}

public void setOrganizationsUrl(String organizationsUrl) {
    this.organizationsUrl = organizationsUrl;
}

public String getReposUrl() {
    return reposUrl;
}

public void setReposUrl(String reposUrl) {
    this.reposUrl = reposUrl;
}

public String getEventsUrl() {
    return eventsUrl;
}

public void setEventsUrl(String eventsUrl) {
    this.eventsUrl = eventsUrl;
}

public String getReceivedEventsUrl() {
    return receivedEventsUrl;
}

public void setReceivedEventsUrl(String receivedEventsUrl) {
    this.receivedEventsUrl = receivedEventsUrl;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public Boolean getSiteAdmin() {
    return siteAdmin;
}

public void setSiteAdmin(Boolean siteAdmin) {
    this.siteAdmin = siteAdmin;
}}

Ошибка Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)


Ответы (1 шт):

Автор решения: Alex_Skvortsov

Api возвращает список, а Вы указали в возвращаемом типе объект, замените

public interface UsersAPI {
    @GET("/users")
    Call<UserClass> getUsers();
}

на

public interface UsersAPI {
    @GET("/users")
    Call<ArrayList<UserClass>> getUsers();
}

И соответствующим образом измените остальной код, вызывающий эту функцию.

То, что видно в Вашем вопросе Можно поменять так:

NetworkService.getInstance().usersAPI().getUsers().enqueue(new Callback<ArrayList<UserClass>>() {
    @Override
    public void onResponse(Call<ArrayList<UserClass>> call, Response<ArrayList<UserClass>> response) {
        ArrayList<UserClass> userClassArray = response.body();

        tvLogin.append(userClassArray[0].getLogin());//будет ошибка при пустом списке
        tvName.append(userClassArray[0].getHtmlUrl());

    }

    @Override
    public void onFailure(Call<ArrayList<UserClass>> call, Throwable t) {
        Toast.makeText(MainActivity.this, "Не получилось", Toast.LENGTH_SHORT).show();
    }
});
→ Ссылка