首页 > 解决方案 > 使用GET方法获取数据的Json结构android studio改造java

问题描述

我收到一个错误:预期 BEGIN_ARRAY 但在第 1 行第 2 列路径是 BEGIN_OBJECT $ 我的理解是改造需要 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"
        },
}

我认为是“用户”:导致了这个问题。但我不知道如何解决这个问题。

如果有人有解决方案,非常感谢。

标签: javaandroidjsonretrofit

解决方案


你的响应类应该是

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

推荐阅读