Я получил сообщение об ошибке: ожидался 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"
},
}
Я думаю, что это были "пользователи": которые вызывают эту проблему. Но я не знаю, как это решить.
Большое спасибо, если у кого-то есть решение.
ваш класс ответа должен быть
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());
}
});
Да ! Я сомневаюсь, ха-ха :p Итак, я не очень силен в Android Studio, поэтому я пытаюсь научиться, ха-ха :) Но большое спасибо за вашу помощь!
В вашем случае есть проблема с вашим ответом, т.е. с классом пользователя, поэтому отображается эта ошибка.
Измените свой класс данных (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;
}
}
Привет, спасибо за ваш ответ. Я постараюсь реализовать ваше исправление. Спасибо !
@Раджасекаран
Другая моя проблема:
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 Но когда я запускаю в режиме отладки, мой список пользователей пуст
ваш API возвращает ответ?
ваша бизнес-логика не очень хороша внутри onResponse . проверить мой ответ
На самом деле, мой: APIResponse users = response.body(); List<User> listStudent = null; listUser = users.getUsers(); Log.e("MainActivity", "Success : " + listUser);
Когда я ставлю точку останова на getUsers (), мой пользователь «нулевой»
listUser печатает нуль? у вашего API есть результаты?
Да, response.body.users = null и listUsers: null
ваш API возвращает ответ?
когда я вхожу, у меня нет ответа: пользователи равны нулю
ваш API возвращает пользователей в ответ?
хорошо, мой плохой, я нашел ошибку. я забыл изменить @SerializedName («пользователи») ха-ха! это работа!! большое спасибо !
@dusk хахаха может быть, я только что написал прототип для вас :-)