【问题标题】:How to receive a Json array ("result") with retrofit2如何使用retrofit2接收Json数组(“结果”)
【发布时间】:2018-10-07 04:18:26
【问题描述】:

我知道如何接收这种类型的数组:

[
{
    "username": "luis",
    "job": "developer",
    "age": 23
}
]

我的问题是当我必须接收具有特定名称的数组时:

{"result":[{"userid":"1","username":"Luis","job":"developer","age":"23"}]}

在这种情况下,我必须使用retrofit2 接收上面名称为“result”的数组。谁能帮助我,我是 Retrofit 的新手。

这是我尝试过的:

主活动

apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
       Call<List<Workers>> call = apiInterface.getWorkers();

       call.enqueue(new Callback<List<Workers>>() {
           @Override
           public void onResponse(Call<List<Workers>> call, Response<List<Workers>> response) {
               list=response.body();
               adapter = new WorkerAdapter(getApplicationContext(),list);
               recyclerView.setAdapter(adapter);


           }

           @Override
           public void onFailure(Call<List<Workers>> call, Throwable t) {

           }
       });

ApiClient:

public class ApiClient {

    public static final String BASE_URL="http://192.168.31.206/test1_database/";
    public static Retrofit retrofit = null;

    public static Retrofit getApiClient(){

        if (retrofit==null){
            retrofit=new Retrofit.Builder().baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create()).build();
        }
        return retrofit;
    }

}

API接口:

public interface ApiInterface {

    @GET("getAllUser.php")
    Call<List<Workers>> getWorkers();


}

我的 POJO 或工人类:

public class Workers {

    @SerializedName("username")
    String Name;
    @SerializedName("job")
    String Job;
    @SerializedName("age")
    int Age;

    public String getName() {
        return Name;
    }

    public String getJob() {
        return Job;
    }

    public int getAge() {
        return Age;
    }
} 

最后是我的 RecyclerAdpter:

public class WorkerAdapter extends RecyclerView.Adapter<WorkerAdapter.ViewHolder>{
    Context context;
    List<Workers> list;

    public WorkerAdapter(Context context,List<Workers> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.item_recycler,parent,false);
        ViewHolder holder = new ViewHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.name.setText(list.get(position).getName());
        holder.job.setText(list.get(position).getJob());
        holder.age.setText(String.valueOf(list.get(position).getAge()));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView name, job, age;

        public ViewHolder(View itemView) {
            super(itemView);
            name= (TextView) itemView.findViewById(R.id.nametxt);
            job=(TextView) itemView.findViewById(R.id.jobtxt);
            age=(TextView) itemView.findViewById(R.id.agetxt);
        }
    }
}

我已经卡了两天了,我仍然无法解决它。请帮忙!

【问题讨论】:

    标签: java android android-studio gson retrofit2


    【解决方案1】:

    创建一个名为 Result 的类模型,并在 Interface 类中编写以下代码:

     @GET("your endpoint")
     Call<Result>getResult();
    

    并在 Result 类中编写以下代码:

     @SerializedName("result") 
     private List<UserInfo> userInfo;
    

    祝你好运。

    【讨论】:

    • 谢谢,但是如何在我的 MainActivity 中进行调用?
    • 你可以像这样访问UserInfo:response.body().getResult().getUserId;将此代码写入 onResponce
    • 那么我应该在同一个 Result 类中包含用户名、工作和年龄的 getter 吗?
    • 您必须在 UserInfo 类中定义用户名、工作和年龄,并为它们编写 getter。
    • 我无法调用 response.body().getResult().getName
    【解决方案2】:
    package com.example;
    
    import java.util.List;
    
    public class Example {
    
    private List<Result> result = null;
    
    public List<Result> getResult()
    {
        return result;
    }
    
    public void setResult(List<Result> result)
    {
        this.result = result;
    }}
    
    
    
    package com.example;
    
    
    public class Result {
    
    private String userid;
    private String username;
    private String job;
    private String age;
    
    public String getUserid()
    {
        return userid;
    }
    
    public void setUserid(String userid)
    {
        this.userid = userid;
    }
    
    public String getUsername()
    {
        return username;
    }
    
    public void setUsername(String username)
    {
        this.username = username;
    }
    
    public String getJob()
    {
        return job;
    }
    
    public void setJob(String job)
    {
        this.job = job;
    }
    
    public String getAge()
    {
        return age;
    }
    
    public void setAge(String age)
    {
        this.age = age;
    }}
    

    使用this 网站制作一些模型。我已经使用这个网站完成了上述代码。

    现在,这样做

    @Get<"url">
    call<Example> get()
    

    【讨论】:

    • 但是如何调用 OnResponse 中的数据呢?
    • @Shaon 您好,您发布的链接已损坏。
    【解决方案3】:

    如果一定要使用这个json格式

    {"result":[{"userid":"1","username":"Luis","job":"developer","age":"23"}]}
    

    你必须像这样创建两个模型:

    class Result {
    
         @SerializedName("result")
         @Expose
         List<ResultDetail> result; 
    } 
    
    class ResultDetail {
    
         @SerializedName("userid")
         @Expose
         String userId ;// use int instead 
         String username;
         String job;
         String age; // use int instead
    }
    

    将 GsonConverterFactory 添加到您的应用 build.gradle

    com.squareup.retrofit2:converter-gson:2.14
    

    现在构建改造实例:

     Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("some base url like : www.example.com/api/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();
    
     YourSerivce service = retrofit.create(YourService.class);
    
    
     interface YourService {
       @GET("someThing")  // complete url is www.example.com/api/someThing
       Call<Result> getResult();
     }
    

    最后得到这样的结果:

    retrofit.getResult().enqueue(.....)
    

    【讨论】:

    • 我会尝试但只是为了让您知道我使用的是 Java 而不是 Kotlin。无论如何,我会尝试将其转换为 Java
    • 在我的 onresponse 方法中,我执行 Log.i("Result ", response.body().toString());什么都没有出来。
    【解决方案4】:

    在给出的 3 个答案和一些视频教程的指导下进行了大量测试后,我终于弄明白了。

    ApiClient:

    public class ApiClient {
    
        private static final String BASE_URL="http://192.168.31.206/";
        public static Retrofit retrofit = null;
        public static ApiInterface instance=null;
    
        public static Retrofit getApiClient(){
    
            if (retrofit==null){
                retrofit=new Retrofit.Builder().baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create()).build();
            }
            return retrofit;
        }
    
        public static ApiInterface getInterface(){
    
            if (instance==null){
                instance=getApiClient().create(ApiInterface.class);
            }
    
    
            return instance;
        }
    
    }
    

    API接口:

    public interface ApiInterface {
    
        //this could be test1_database/getAllUser.json
        @GET("test1_database/getAllUser.php")
        Call<Result> getWorkers();
    
    
    }
    

    工人(POJO)类:

    public class Workers {
    
    
        @SerializedName("userid")
        private String userid;
        @SerializedName("username")
        private String username;
        @SerializedName("job")
        private String job;
        @SerializedName("age")
        private String age;
    
        public String getUserid() {
            return userid;
        }
    
        public void setUserid(String userid) {
            this.userid = userid;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getJob() {
            return job;
        }
    
        public void setJob(String job) {
            this.job = job;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
    }
    

    结果(POJO)类:

    public class Result {
    
        @SerializedName("result")
        private List<Workers> result = null;
    
        public List<Workers> getResult() {
            return result;
        }
    
        public void setResult(List<Workers> result) {
            this.result = result;
        }
    
    }
    

    MainActivity 类:

    public class MainActivity extends AppCompatActivity {
    
        RecyclerView recyclerView;
        List<Workers> list = new ArrayList<>();
        WorkerAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            recyclerView = findViewById(R.id.recycler);
            recyclerView.setHasFixedSize(true);
            LinearLayoutManager manager = new LinearLayoutManager(this);
            manager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerView.setLayoutManager(manager);
    
            ApiInterface apiCall = ApiClient.getInterface();
            Call<Result> call = apiCall.getWorkers();
    
           call.enqueue(new Callback<Result>() {
               @Override
               public void onResponse(Call<Result> call, Response<Result> response) {
                   list = response.body().getResult();
                   adapter = new WorkerAdapter(MainActivity.this,list);
                   recyclerView.setAdapter(adapter);
               }
    
               @Override
               public void onFailure(Call<Result> call, Throwable t) {
    
               }
           });
    
        }}
    

    我正在使用此适配器在 recyclerview 中显示结果:

    public class WorkerAdapter extends RecyclerView.Adapter<WorkerAdapter.ViewHolder>{
        Context context;
        List<Workers> list;
    
        public WorkerAdapter(Context context,List<Workers> list) {
            this.context = context;
            this.list = list;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(context).inflate(R.layout.item_recycler,parent,false);
            ViewHolder holder = new ViewHolder(v);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
    
            holder.id.setText(String.valueOf(list.get(position).getUserid()));
            holder.name.setText(list.get(position).getUsername());
            holder.job.setText(list.get(position).getJob());
            holder.age.setText(String.valueOf(list.get(position).getAge()));
        }
    
        @Override
        public int getItemCount() {
            return list.size();
        }
    
    
        public class ViewHolder extends RecyclerView.ViewHolder {
    
            TextView name, job, age,id;
    
            public ViewHolder(View itemView) {
                super(itemView);
                id = (TextView) itemView.findViewById(R.id.idtxt);
                name= (TextView) itemView.findViewById(R.id.nametxt);
                job=(TextView) itemView.findViewById(R.id.jobtxt);
                age=(TextView) itemView.findViewById(R.id.agetxt);
            }
        }
    }
    

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-04
      • 2023-03-31
      • 2017-10-10
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      相关资源
      最近更新 更多