Структура Json для получения данных с помощью метода GET Android Studio Retrofit java

Я получил сообщение об ошибке: ожидался BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1, столбце 2, пути $ Насколько я понимаю, для модернизации требуется BEGIN_ARRAY? Я нашел некоторые решения, но они не работают для меня.

Я пробовал некоторые решения, которые не работают. Я думаю, что это была структура JSON, которую я не знаю, как ее использовать.

Итак, для моего кода: Мой интерфейс


public interface UserService {

    String ENDPOINT = "http://localhost:3000/";

    @GET("users")
    Call<List<User>> getUsers();

}

Данные


public class User {
    @SerializedName("_id")
    @Expose
    private int _id;

    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("firstname")
    @Expose
    private String firstname;

    @SerializedName("picture")
    @Expose
    private String picture;


    public int getId() {
        return _id;
    }


    public String getName() {
        return name;
    }


    public String getFirstname() {
        return firstname;
    }


    public String getPicture() {
        return picture;
    }

}

Моя основная деятельность


textViewResult = findViewById(R.id.text_view_result);

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(UserService.ENDPOINT)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        UserService jsonUserService = retrofit.create(UserService.class);
        Call<List<User>> call = jsonUserService.getUsers();


        call.enqueue(new Callback<List<User>>() {
            @Override
            public void onResponse(Call<List<User>> call, Response<List<User>> response) {
                if(!response.isSuccessful()){
                    textViewResult.setText("Code : " + response.code());
                    return;
                }

                List<User> users = response.body();

                for(User user : users){
                    String content = "";
                    content += "ID: " + user.getId() + '\n';
                    content += "FirstName: " + user.getFirstname() + '\n';
                    content += "Name: " + user.getName() + '\n';
                    content += "Picture: " + user.getPicture() + '\n';

                    textViewResult.append(content);
                }
            }

            @Override
            public void onFailure(Call<List<User>> call, Throwable t) {
                textViewResult.setText(t.getMessage());
            }
        });

И мой json выглядит так..

{
    "users": [
        {
            "_id": 1,
            "name": "test",
            "firstname": "user",
            "picture": "http://localhost:3000/imgs/1.jpg"
        },
        {
            "_id": 2,
            "name": "test1",
            "firstname": "user1",
            "picture": "http://localhost:3000/imgs/2.jpg"
        },
        {
            "_id": 3,
            "name": "test2",
            "firstname": "user2",
            "picture": "http://localhost:3000/imgs/3.jpg"
        },
}

Я думаю, что это были "пользователи": которые вызывают эту проблему. Но я не знаю, как это решить.

Большое спасибо, если у кого-то есть решение.

Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
99
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

ваш класс ответа должен быть

class APIResponse{

   @SerializedName("users")
   @Expose
   private List<User> users;

  public List<User> getUsers()
   {return users;}

  public void setUsers(List<User> users)
   {this.users= users;}

}

Интерфейс должен быть ;

public interface UserService {

String ENDPOINT = "http://localhost:3000/";

@GET("users")
Call<APIResponse> getUsers();

}

ваш метод enqueue() должен быть:

 call.enqueue(new Callback<APIResponse>() {
        @Override
        public void onResponse(Call<APIResponse> call, Response<APIResponse> response) {
            if(!response.isSuccessful()){
                textViewResult.setText("Code : " + response.code());
                return;
            }

            List<User> users = response.body().getUsers();

            for(User user : users){
                String content = "";
                content += "ID: " + user.getId() + '\n';
                content += "FirstName: " + user.getFirstname() + '\n';
                content += "Name: " + user.getName() + '\n';
                content += "Picture: " + user.getPicture() + '\n';

                textViewResult.append(content);
            }
        }

        @Override
        public void onFailure(Call<List<User>> call, Throwable t) {
            textViewResult.setText(t.getMessage());
        }
    });

@dusk хахаха может быть, я только что написал прототип для вас :-)

Rajasekaran M 22.05.2019 14:15

Да ! Я сомневаюсь, ха-ха :p Итак, я не очень силен в Android Studio, поэтому я пытаюсь научиться, ха-ха :) Но большое спасибо за вашу помощь!

dusk 22.05.2019 14:19

В вашем случае есть проблема с вашим ответом, т.е. с классом пользователя, поэтому отображается эта ошибка.

Измените свой класс данных (User.java) на ResponseClass.java ::

public class ResponseClass {

@SerializedName("users")
@Expose
private List<User> users = null;

public List<User> getUsers() {
    return users;
}

public void setUsers(List<User> users) {
    this.users = users;
}


public class User {

    @SerializedName("_id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("firstname")
    @Expose
    private String firstname;
    @SerializedName("picture")
    @Expose
    private String picture;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }

}

Привет, спасибо за ваш ответ. Я постараюсь реализовать ваше исправление. Спасибо !

dusk 22.05.2019 13:52

@Раджасекаран

Другая моя проблема:


public class User {
    @SerializedName("_id")
    @Expose
    private int _id;

    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("firstname")
    @Expose
    private String firstname;

    @SerializedName("picture")
    @Expose
    private String picture;

    //Getters
}


public class APIResponse {
    @SerializedName("users")
    @Expose
    private List<User> users = null;

    public List<User> getUsers()
    {return users;}

    public void setUsers(List<User> users)
    {this.users= users;}
}

Вот моя основная активность


        UserService jsonUserService = retrofit.create(UserService.class);
        Call<List<APIResponse>> call = jsonUserService.getUsers();


        call.enqueue(new Callback<List<APIResponse>>() {
            @Override
            public void onResponse(Call<List<APIResponse>> call, Response<List<APIResponse>> response) {
                if(!response.isSuccessful()){
                    textViewResult.setText("Code : " + response.code());
                    return;
                }

                List<User> listUser = null;

                List<APIResponse> users = response.body();

                for(APIResponse user : users){
                    listUSer = user.getUsers();
                }
                for(User user : listUser){
                    String content = "";
                    content += "ID: " + user.getId() + '\n';
                    content += "FirstName: " + user.getFirstname() + '\n';
                    content += "Name: " + user.getName() + '\n';
                    content += "Picture: " + user.getPicture() + '\n';

                    textViewResult.append(content);
                }

                Log.e("MainActivity", "Success : " + listUser);
            }

            @Override
            public void onFailure(Call<List<APIResponse>> call, Throwable t) {
                Log.e("MainActivity", "Failure : " + t);
            }


        });

2019-05-22 14:05:07.983 18425-18425/com.example.user E/MainActivity: Ошибка: java.lang.IllegalStateException: ожидалось BEGIN_ARRAY, но было BEGIN_OBJECT в строке 1 столбца 2 пути $

У меня такая же ошибка :(

Большое спасибо !

Да, я нашел это после публикации: p Но когда я запускаю в режиме отладки, мой список пользователей пуст

dusk 22.05.2019 14:42

ваш API возвращает ответ?

Rajasekaran M 22.05.2019 14:45

ваша бизнес-логика не очень хороша внутри onResponse . проверить мой ответ

Rajasekaran M 22.05.2019 14:47

На самом деле, мой: APIResponse users = response.body(); List<User> listStudent = null; listUser = users.getUsers(); Log.e("MainActivity", "Success : " + listUser); Когда я ставлю точку останова на getUsers (), мой пользователь «нулевой»

dusk 22.05.2019 14:53

listUser печатает нуль? у вашего API есть результаты?

Rajasekaran M 22.05.2019 15:06

Да, response.body.users = null и listUsers: null

dusk 22.05.2019 15:10

ваш API возвращает ответ?

Rajasekaran M 22.05.2019 15:20

когда я вхожу, у меня нет ответа: пользователи равны нулю

dusk 22.05.2019 15:26

ваш API возвращает пользователей в ответ?

Rajasekaran M 22.05.2019 15:33

хорошо, мой плохой, я нашел ошибку. я забыл изменить @SerializedName («пользователи») ха-ха! это работа!! большое спасибо !

dusk 22.05.2019 15:41

Другие вопросы по теме