Как получить массив Json («результат») с помощью retrofit2 - PullRequest
0 голосов
/ 07 октября 2018

Я знаю, как получать массивы, когда они относятся к этому типу:

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

Моя проблема заключается в том, что я должен получить массив с определенным именем, например так:

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

inВ этом случае я должен получить массив выше с именем «result» с помощью retrofit2.Может кто-нибудь, пожалуйста, помогите мне, я новичок в модернизации.

Это то, что я пытался:

MainActivity

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

}

ApiInterface:

public interface ApiInterface {

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


}

мой класс POJO или Workers:

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

Я застрял в течение двух днейсейчас, и я до сих пор не могу решить это.Пожалуйста помоги!

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

После долгих тестирований, руководствуясь данными 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;
    }

}

ApiInterface:

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) {

           }
       });

    }}

Я показываю результаты вобзор утилизатора с использованием этого адаптера:

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

Спасибо всем за помощь!

0 голосов
/ 07 октября 2018
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;
}}

Сделайте какую-нибудь модель, используя этот веб-сайт.Я сделал этот код с помощью этого сайта.

Теперь сделайте это

@Get<"url">
call<Example> get()
0 голосов
/ 07 октября 2018

если вам нужно использовать этот формат 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(.....)
0 голосов
/ 07 октября 2018

создайте модель класса с именем Result и в классе Interface напишите этот код:

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

, а в классе Result напишите следующий код:

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

удачи.

...