简体   繁体   中英

Parse this nested JSON array in android using retrofit

I have this JSON array object response

{ "Exam":[
{

    "mock_test":
        [
            {
                id: "14",
                option_a: "android developer",
                option_b: "programmer",
                option_c: "coder",
                option_d: "developer",
                is_correct: "1",
                question_number: "14",
                questions: "hello this pavan sharma",
                            
            },
            {
                id: "14",
                option_a: "android developer",
                option_b: "programmer",
                option_c: "coder",
                option_d: "developer",
                is_correct: "1",
                question_number: "14",
                questions: "hello this pavan sharma",
                            
            },
            {
                id: "14",
                option_a: "android developer",
                option_b: "programmer",
                option_c: "coder",
                option_d: "developer",
                is_correct: "1",
                question_number: "14",
                questions: "hello this pavan sharma",
                        
            },  

        ]
},
{
    "mock_test":
    [
        {
            id: "14",
            option_a: "android developer",
            option_b: "programmer",
            option_c: "coder",
            option_d: "developer",
            is_correct: "1",
            question_number: "14",
            questions: "hello this pavan sharma",
                        
        },
        {
            id: "14",
            option_a: "android developer",
            option_b: "programmer",
            option_c: "coder",
            option_d: "developer",
            is_correct: "1",
            question_number: "14",
            questions: "hello this pavan sharma",
                    
        },
        {
            id: "14",
            option_a: "android developer",
            option_b: "programmer",
            option_c: "coder",
            option_d: "developer",
            is_correct: "1",
            question_number: "14",
            questions: "hello this pavan sharma",   
        },  

    ]

}
]}

I have created model class like

public class ModelClass implements Serializable {

@SerializedName("id")
@Expose
private int id;

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

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

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

public ModelClass(int id, String option_a, String option_b, String option_c) {
    this.id = id;
    this.option_a = option_a;
    this.option_b = option_b;
    this.option_c = option_c;
}

public int getId() {
    return id;
}

public String getOption_a() {
    return option_a;
}

public String getOption_b() {
    return option_b;
}

public String getOption_c() {
    return option_c;
}}

another model class is

public class DataModelClass {

@SerializedName("mock_test")
@Expose
private ArrayList<ModelClass> mockTest=null;

public DataModelClass(ArrayList<ModelClass> mockTest) {
    this.mockTest = mockTest;
}

public ArrayList<ModelClass> getMockTest() {
    return mockTest;
}

another model class is

public class MainModelClass  implements Serializable {

@SerializedName("Exam")
@Expose
private ArrayList<DataModelClass> exam=null;

public MainModelClass(ArrayList<DataModelClass> exam) {
    this.exam = exam;
}

public ArrayList<DataModelClass> getExam() {
    return exam;
}

In MainActivity

        apiInterface=ApiClient.getRetrofitInstance().create(API.class);
    Call<DataModelClass> call = apiInterface.getEmpData();

    call.enqueue(new Callback<DataModelClass>() {
        @Override
        public void onResponse(Call<DataModelClass> call, Response<DataModelClass> response) {
            progressDialog.dismiss();
            
            
            
            
        }

        @Override
        public void onFailure(Call<DataModelClass> call, Throwable t) {
            Toast.makeText(getApplicationContext(),""+t,Toast.LENGTH_SHORT).show();
        }
    });

please tell me how can i call inner object like id,option_a, option_b, option_c etc... i can create recycler view for this but i just want to know how to call these inner objects.

Use MainModelClass as Generics instead:

Call<MainModelClass> call = apiInterface.getEmpData();

If you still have trouble getting the right response from server, then you need these 3 POJOs:

public class MainResponse {
@SerializedName("Exam")
ArrayList<ExamContainer> examContainers;

public ArrayList<ExamContainer> getExamContainers() {
    return examContainers;
}

public void setExamContainers(ArrayList<ExamContainer> examContainers) {
    this.examContainers = examContainers;
}
}

And then:

public class ExamContainer {

@SerializedName("mock_test")
private ArrayList<MockTest> mockTests;


public ArrayList<MockTest> getMockTests() {
    return mockTests;
}

public void setMockTests(ArrayList<MockTest> mockTests) {
    this.mockTests = mockTests;
}
}

And finally :

public class MockTest
{
private String id;

private String option_a;

private String option_b;

private String option_c;

private String option_d;

private String is_correct;

private String question_number;

private String questions;

public void setId(String id){
    this.id = id;
}
public String getId(){
    return this.id;
}
public void setOption_a(String option_a){
    this.option_a = option_a;
}
public String getOption_a(){
    return this.option_a;
}
public void setOption_b(String option_b){
    this.option_b = option_b;
}
public String getOption_b(){
    return this.option_b;
}
public void setOption_c(String option_c){
    this.option_c = option_c;
}
public String getOption_c(){
    return this.option_c;
}
public void setOption_d(String option_d){
    this.option_d = option_d;
}
public String getOption_d(){
    return this.option_d;
}
public void setIs_correct(String is_correct){
    this.is_correct = is_correct;
}
public String getIs_correct(){
    return this.is_correct;
}
public void setQuestion_number(String question_number){
    this.question_number = question_number;
}
public String getQuestion_number(){
    return this.question_number;
}
public void setQuestions(String questions){
    this.questions = questions;
}
public String getQuestions(){
    return this.questions;
}
}

Now you write your call like this:

Call<MainResponse> call = apiInterface.getEmpData();
//rest of your code

Here is the MainActivity code

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;
private API apiInterface;
ProgressDialog progressDialog;

Adapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(layout.activity_main);
    getEmployeeData();
}
private void getEmployeeData() {

    /*progressDialog=new ProgressDialog(MainActivity.this);
    progressDialog.show();
    progressDialog.setContentView(layout.prgress_bar_layout);
    progressDialog.getWindow().setBackgroundDrawable(new 
    ColorDrawable(Color.TRANSPARENT)); */

    recyclerView=(RecyclerView)findViewById(id.recyclerView);
    recyclerView.setLayoutManager( new LinearLayoutManager(this));
    apiInterface=ApiClient.getRetrofitInstance().create(API.class);

    Call<MainResponse> call = apiInterface.getEmpData();
    call.enqueue(new Callback<MainResponse>() {
        @Override
        public void onResponse(Call<MainResponse> call, Response<MainResponse> 
        response) {
        //  progressDialog.dismiss();

           ArrayList<MockTest>datalist=response.body().getExam();
             adapter = new Adapter(datalist, MainActivity.this);
            recyclerView.setAdapter(adapter);
        }

        @Override
        public void onFailure(Call<MainResponse> call, Throwable t) {
            Toast.makeText(getApplicationContext(),""+t,Toast.LENGTH_SHORT).show();
        }
    });
}}

And here is the Adapter code

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

List<MockTest> dataList;
Context context;

public Adapter(ArrayList<MockTest> dataList, Context context) {
    this.dataList = dataList;
    this.context = context;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.design_recycler_view_cell,parent,false);
    final ViewHolder holder=new ViewHolder(view);
    return holder;
}

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

    holder.option_a.setText(dataList.get(position).getOptionA());
    holder.option_b.setText(dataList.get(position).getOptionB());
    holder.question.setText(dataList.get(position).getQuestions());
}

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

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView option_a,option_b,question;
    Button button;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        option_a=itemView.findViewById(R.id.editname);
        option_a=itemView.findViewById(R.id.editAge);
        question=itemView.findViewById(R.id.editSalary);
        button=itemView.findViewById(R.id.btn);
    }
}}

Please also check the onResponse Method of MainActivity because i am getting error in ArrayList<MockTest>datalist=response.body().getExam();

请检查它不是有效的 json 格式,缺少键的双引号

replace above Json with this because your Json format is wrong

{
 "Exam": [
        {
          "mock_test": [
            {
              "id": "14",
              "option_a": "android developer",
              "option_b": "programmer",
              "option_c": "coder",
              "option_d": "developer",
              "is_correct": "1",
              "question_number": "14",
              "questions": "hello this pavan sharma"
            },
            {
              "id": "14",
              "option_a": "android developer",
              "option_b": "programmer",
              "option_c": "coder",
              "option_d": "developer",
              "is_correct": "1",
              "question_number": "14",
              "questions": "hello this pavan sharma"
            },
            {
              "id": "14",
              "option_a": "android developer",
              "option_b": "programmer",
              "option_c": "coder",
              "option_d": "developer",
              "is_correct": "1",
              "question_number": "14",
              "questions": "hello this pavan sharma"
            }
          ]
        },
        {
          "mock_test": [
            {
              "id": "14",
              "option_a": "android developer",
              "option_b": "programmer",
              "option_c": "coder",
              "option_d": "developer",
              "is_correct": "1",
              "question_number": "14",
              "questions": "hello this pavan sharma"
            },
            {
              "id": "14",
              "option_a": "android developer",
              "option_b": "programmer",
              "option_c": "coder",
              "option_d": "developer",
              "is_correct": "1",
              "question_number": "14",
              "questions": "hello this pavan sharma"
            },
            {
              "id": "14",
              "option_a": "android developer",
              "option_b": "programmer",
              "option_c": "coder",
              "option_d": "developer",
              "is_correct": "1",
              "question_number": "14",
              "questions": "hello this pavan sharma"
            }
          ]
        }
      ]
    }

and replace above model classes with below model classes

  package com.example;

import java.util.List;

public class Exam {

private List<MockTest> mockTest = null;

public List<MockTest> getMockTest() {
return mockTest;
}

public void setMockTest(List<MockTest> mockTest) {
this.mockTest = mockTest;
}

}

=============================

  package com.example;
    
    import java.util.List;
    
    public class Example {
    
    private List<Exam> exam = null;
    
    public List<Exam> getExam() {
    return exam;
    }
    
    public void setExam(List<Exam> exam) {
    this.exam = exam;
    }

=========================================

package com.example;
public class MockTest {

private String id;
private String optionA;
private String optionB;
private String optionC;
private String optionD;
private String isCorrect;
private String questionNumber;
private String questions;

public String getId() {
return id;
}

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

public String getOptionA() {
return optionA;
}

public void setOptionA(String optionA) {
this.optionA = optionA;
}

public String getOptionB() {
return optionB;
}

public void setOptionB(String optionB) {
this.optionB = optionB;
}

public String getOptionC() {
return optionC;
}

public void setOptionC(String optionC) {
this.optionC = optionC;
}

public String getOptionD() {
return optionD;
}

public void setOptionD(String optionD) {
this.optionD = optionD;
}

public String getIsCorrect() {
return isCorrect;
}

public void setIsCorrect(String isCorrect) {
this.isCorrect = isCorrect;
}

public String getQuestionNumber() {
return questionNumber;
}

public void setQuestionNumber(String questionNumber) {
this.questionNumber = questionNumber;
}

public String getQuestions() {
return questions;
}

public void setQuestions(String questions) {
this.questions = questions;
}

}
        
        }

Now u get response make to parse as you like

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM