Reputation: 53
I have three nested array in my main array. It is my model:
data class Test (val id: Int,
val numberQuestion: String,
val question: String,
val questionImageSrc: String,
val examination: Boolean,
val typeQuestion: String,
val singleChoiceAnswers: ArrayList<singleChoiseAnswer>,
val multipleChoiceAnswers: ArrayList<multipleChoiceAnswers>,
val inputAnswer: ArrayList<inputAnswer>)
data class multipleChoiceAnswers(val letter: String,
val text: String,
val correctAnswer: Boolean,
val checked: Boolean)
data class singleChoiseAnswer(val letter: String,
val text: String,
val correctAnswer: Boolean,
val checked: Boolean)
data class inputAnswer(val correctAnswer: String,
val userAnswer: String)
And I must take data from json, but i dont know hot to put data to the nested array. It is my code:
private fun jsonResult(jsonString: String?) {
val jsonArray = JSONArray(jsonString)
val list = ArrayList<Test>()
val slist = ArrayList<singleChoiseAnswer>()
val mlist = ArrayList<multipleChoiceAnswers>()
var i = 0
var j = 0
while (i < jsonArray.length()) {
val jsonObject = jsonArray.getJSONObject(i)
list.add(
Test(
jsonObject.getInt("id"),
jsonObject.getString("numberQuestion"),
jsonObject.getString("question"),
jsonObject.getString("questionImageSrc"),
jsonObject.getBoolean("examination"),
jsonObject.getString("typeQuestion"),
singleChoiseAnswer(
jsonObject.optString("letter"),
jsonObject.optString("text"),
jsonObject.optBoolean("correctAnswer"),
jsonObject.optBoolean("checked"),
multipleChoiceAnswers(
jsonObject.optString("letter"),
jsonObject.optString("text"),
jsonObject.optBoolean("correctAnswer"),
jsonObject.optBoolean("checked")
),
inputAnswer(
jsonObject.optString("correctAnswer"),
jsonObject.optString("userAnswer")
)
)
)
i++
}
My JSON:
[
{
"id": 0,
"numberQuestion": "Вопрос 1",
"question": "Прочитайте текст и выполните задания 1—3.\n\n(1)Тропический лес — лес, распространённый в тропическом, экваториальном и субэкваториальном поясах. (2)В этих широтах встречающиеся воздушные течения приносят в регион в любое время года большое количество осадков, сочетающихся с жарким климатом. (3)… для тропической местности характерна роскошная буйная растительность.\n\n➤Укажите два предложения, в которых верно передана ГЛАВНАЯ информация, содержащаяся в тексте.",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "multipleChoice",
"singleChoiceAnswers": [],
"multipleChoiceAnswers": [
{
"letter": "А.",
"text": "В тропических, экваториальных и субэкваториальных широтах встречающиеся воздушные течения приносят в регион в любое время года большое количество осадков, которые сочетаются с жарким климатом.",
"correctAnswer": false,
"checked": false
},
{
"letter": "Б.",
"text": "Тропический лес — лес, распространённый в тропическом, экваториальном и субэкваториальном поясах, для которых характерно большое количество осадков и жаркий климат, что создает условия для роста роскошной буйной растительности.",
"correctAnswer": true,
"checked": false
},
{
"letter": "В.",
"text": "Тропический лес — лес, распространённый в тропическом, экваториальном и субэкваториальном поясах, для которого характерна буйная растительность.",
"correctAnswer": false,
"checked": false
},
{
"letter": "Г.",
"text": "Тропический лес произрастает в тропических, экваториальных и субэкваториальных широтах, где большое количество осадков в сочетании с жарким климатом создает условия для роста роскошной буйной растительности.",
"correctAnswer": true,
"checked": false
},
{
"letter": "Д.",
"text": "Для тропической местности характерна роскошная буйная растительность.",
"correctAnswer": false,
"checked": false
}
],
"inputAnswer": []
},
{
"id": 1,
"numberQuestion": "Вопрос 2",
"question": "Прочитайте текст и выполните задания 1—3.\n\n(1)Тропический лес — лес, распространённый в тропическом, экваториальном и субэкваториальном поясах. (2)В этих широтах встречающиеся воздушные течения приносят в регион в любое время года большое количество осадков, сочетающихся с жарким климатом. (3)… для тропической местности характерна роскошная буйная растительность.\n\n➤Какое из приведённых ниже слов (сочетаний слов) должно быть на месте пропуска в третьем (3) предложении?",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "singleChoice",
"singleChoiceAnswers": [
{
"letter": "А.",
"text": "Даже",
"correctAnswer": false,
"checked": false
},
{
"letter": "Б.",
"text": "Поэтому",
"correctAnswer": true,
"checked": false
},
{
"letter": "В.",
"text": "Однако",
"correctAnswer": false,
"checked": false
},
{
"letter": "Г.",
"text": "Хотя",
"correctAnswer": false,
"checked": false
},
{
"letter": "Д.",
"text": "Напротив,",
"correctAnswer": false,
"checked": false
}
],
"multipleChoiceAnswers": [],
"inputAnswer": []
},
{
"id": 2,
"numberQuestion": "Вопрос 3",
"question": "Прочитайте текст и выполните задания 1—3.\n\n(1)Тропический лес — лес, распространённый в тропическом, экваториальном и субэкваториальном поясах. (2)В этих широтах встречающиеся воздушные течения приносят в регион в любое время года большое количество осадков, сочетающихся с жарким климатом. (3)… для тропической местности характерна роскошная буйная растительность.\n\n➤Прочитайте фрагмент словарной статьи, в которой приводятся значения слова ПОЯС. Определите значение, в котором это слово употреблено в первом (1) предложении текста. Укажите цифру, соответствующую этому значению в приведённом фрагменте словарной статьи. \n\nПОЯС, -а, -ов.",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "singleChoice",
"singleChoiceAnswers": [
{
"letter": "А.",
"text": "Лента, шнур, ремень или прошитая полоса ткани для завязывания, застегивания по талии. Кожаный п",
"correctAnswer": false,
"checked": false
},
{
"letter": "Б.",
"text": "перен. Пространство, окружающее, опоясывающее что-н. Лесопарковый (зеленый) п. столицы",
"correctAnswer": false,
"checked": false
},
{
"letter": "В.",
"text": "Пространство, выделяемое внутри территории страны на основании каких-н. собственных признаков. Тарифный п",
"correctAnswer": false,
"checked": false
},
{
"letter": "Г.",
"text": "Выделяемая по какому-н. признаку часть земной поверхности (между какими-н. параллелями или между двумя меридианами), а также часть небесной сферы. Физико-географический п. Часовой п. П. зодиака",
"correctAnswer": true,
"checked": false
}
],
"multipleChoiceAnswers": [],
"inputAnswer": []
},
{
"id": 3,
"numberQuestion": "Вопрос 4",
"question": "В одном из приведённых ниже слов допущена ошибка в постановке ударения: НЕВЕРНО выделена буква, обозначающая ударный гласный звук. Укажите это слово.",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "singleChoice",
"singleChoiceAnswers": [
{
"letter": "А.",
"text": "зАгодя",
"correctAnswer": false,
"checked": false
},
{
"letter": "Б.",
"text": "бАлованный",
"correctAnswer": true,
"checked": false
},
{
"letter": "В.",
"text": "исчЕрпать",
"correctAnswer": false,
"checked": false
},
{
"letter": "Г.",
"text": "щЁлкать",
"correctAnswer": false,
"checked": false
},
{
"letter": "Д.",
"text": "новостЕй",
"correctAnswer": false,
"checked": false
}
],
"multipleChoiceAnswers": [],
"inputAnswer": []
},
{
"id": 4,
"numberQuestion": "Вопрос 5",
"question": "В одном из приведённых ниже предложений НЕВЕРНО употреблено выделенное слово. Исправьте лексическую ошибку, подобрав к выделенному слову пароним. Запишите подобранное слово.\n\nЗАЧИНЩИК русского национального театра А. Н. Островский сумел передать в своих пьесах дух замоскворечной Москвы. \n\nНа уроке русского языка шестиклассники писали ДИКТАНТ. \n\nНе стоит падать духом, столкнувшись с рядовыми ЖИТЕЙСКИМИ трудностями. \n\nНа кинофестивале фильм русского режиссера получил приз ЗРИТЕЛЬСКИХ симпатий. \n\nМногие АБОНЕНТЫ телефонной сети были недовольны из-за возникших неполадок на линии.",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "input",
"singleChoiceAnswers": [],
"multipleChoiceAnswers": [],
"inputAnswer": [
{
"correctAnswer": "зачинатель",
"userAnswer": ""
}
]
},
{
"id": 5,
"numberQuestion": "Вопрос 6",
"question": "В одном из выделенных ниже слов допущена ошибка в образовании формы слова. Исправьте ошибку и запишите слово правильно. \n\nболее ПЯТИСТА рублей \nпара ЧУЛОК \nнужные АДРЕСА \nподписать ДОГОВОРЫ \nкилограмм ТОМАТОВ",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "input",
"singleChoiceAnswers": [],
"multipleChoiceAnswers": [],
"inputAnswer": [
{
"correctAnswer": "пятисот",
"userAnswer": ""
}
]
},
{
"id": 6,
"numberQuestion": "Вопрос 7",
"question": "Определите слово, в котором пропущена безударная чередующаяся гласная корня. Выпишите это слово, вставив пропущенную букву. \n\nоч..рованный \nпом..стье \nст..пендия \nприк..снуться \nп..риферия",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "input",
"singleChoiceAnswers": [],
"multipleChoiceAnswers": [],
"inputAnswer": [
{
"correctAnswer": "прикоснуться",
"userAnswer": ""
}
]
},
{
"id": 7,
"numberQuestion": "Вопрос 8",
"question": "Определите ряд, в котором в обоих словах пропущена одна и та же буква. Выпишите эти слова, вставив пропущенную букву. Ответ запишите без пробелов, разделяя слова ТОЛЬКО ЗАПЯТОЙ БЕЗ ПРОБЕЛА. \n\nра..смотреть, бе..цветный \nпр..брежный, пр..милый \nпр..дедушка, под..брать \nпред..юльский, вз..мать \nраз..скать, контр..гра",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "input",
"singleChoiceAnswers": [],
"multipleChoiceAnswers": [],
"inputAnswer": [
{
"correctAnswer": "рассмотреть,бесцветный",
"userAnswer": ""
}
]
},
{
"id": 8,
"numberQuestion": "Вопрос 9",
"question": "Укажите слово, в котором на месте пропуска пишется буква E.",
"questionImageSrc": "",
"examination": false,
"typeQuestion": "singleChoice",
"singleChoiceAnswers": [
{
"letter": "А.",
"text": "завис..мый",
"correctAnswer": false,
"checked": false
},
{
"letter": "Б.",
"text": "просматр..вать",
"correctAnswer": false,
"checked": false
},
{
"letter": "В.",
"text": "алюмини..вый",
"correctAnswer": true,
"checked": false
},
{
"letter": "Г.",
"text": "красав..ца",
"correctAnswer": false,
"checked": false
},
{
"letter": "Д.",
"text": "прикле..в",
"correctAnswer": false,
"checked": false
}
],
"multipleChoiceAnswers": [],
"inputAnswer": []
}
Upvotes: 0
Views: 236
Reputation: 36
First you have to make java classes for your json. these are the classes of your relevent json string.
First java class is Test.java
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Test {
@SerializedName(“id”)
@Expose
private Integer id;
@SerializedName(“numberQuestion”)
@Expose
private String numberQuestion;
@SerializedName(“question”)
@Expose
private String question;
@SerializedName(“questionImageSrc”)
@Expose
private String questionImageSrc;
@SerializedName(“examination”)
@Expose
private Boolean examination;
@SerializedName(“typeQuestion”)
@Expose
private String typeQuestion;
@SerializedName(“singleChoiceAnswers”)
@Expose
private List<SingleChoiceAnswer> singleChoiceAnswers = null;
@SerializedName(“multipleChoiceAnswers”)
@Expose
private List<MultipleChoiceAnswer> multipleChoiceAnswers = null;
@SerializedName(“inputAnswer”)
@Expose
private List<InputAnswer> inputAnswer = null;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumberQuestion() {
return numberQuestion;
}
public void setNumberQuestion(String numberQuestion) {
this.numberQuestion = numberQuestion;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getQuestionImageSrc() {
return questionImageSrc;
}
public void setQuestionImageSrc(String questionImageSrc) {
this.questionImageSrc = questionImageSrc;
}
public Boolean getExamination() {
return examination;
}
public void setExamination(Boolean examination) {
this.examination = examination;
}
public String getTypeQuestion() {
return typeQuestion;
}
public void setTypeQuestion(String typeQuestion) {
this.typeQuestion = typeQuestion;
}
public List<SingleChoiceAnswer> getSingleChoiceAnswers() {
return singleChoiceAnswers;
}
public void setSingleChoiceAnswers(List<SingleChoiceAnswer> singleChoiceAnswers) {
this.singleChoiceAnswers = singleChoiceAnswers;
}
public List<MultipleChoiceAnswer> getMultipleChoiceAnswers() {
return multipleChoiceAnswers;
}
public void setMultipleChoiceAnswers(List<MultipleChoiceAnswer> multipleChoiceAnswers) {
this.multipleChoiceAnswers = multipleChoiceAnswers;
}
public List<InputAnswer> getInputAnswer() {
return inputAnswer;
}
public void setInputAnswer(List<InputAnswer> inputAnswer) {
this.inputAnswer = inputAnswer;
}
}
Second java class is InputAnswer.java
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class InputAnswer {
@SerializedName(“correctAnswer”)
@Expose
private String correctAnswer;
@SerializedName(“userAnswer”)
@Expose
private String userAnswer;
public String getCorrectAnswer() {
return correctAnswer;
}
public void setCorrectAnswer(String correctAnswer) {
this.correctAnswer = correctAnswer;
}
public String getUserAnswer() {
return userAnswer;
}
public void setUserAnswer(String userAnswer) {
this.userAnswer = userAnswer;
}
}
Third java class is MultipleChoiceAnswer.java
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class MultipleChoiceAnswer {
@SerializedName(“letter”)
@Expose
private String letter;
@SerializedName(“text”)
@Expose
private String text;
@SerializedName(“correctAnswer”)
@Expose
private Boolean correctAnswer;
@SerializedName(“checked”)
@Expose
private Boolean checked;
public String getLetter() {
return letter;
}
public void setLetter(String letter) {
this.letter = letter;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Boolean getCorrectAnswer() {
return correctAnswer;
}
public void setCorrectAnswer(Boolean correctAnswer) {
this.correctAnswer = correctAnswer;
}
public Boolean getChecked() {
return checked;
}
public void setChecked(Boolean checked) {
this.checked = checked;
}
}
Forth java class is SingleChoiceAnswer.java
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class SingleChoiceAnswer {
@SerializedName(“letter”)
@Expose
private String letter;
@SerializedName(“text”)
@Expose
private String text;
@SerializedName(“correctAnswer”)
@Expose
private Boolean correctAnswer;
@SerializedName(“checked”)
@Expose
private Boolean checked;
public String getLetter() {
return letter;
}
public void setLetter(String letter) {
this.letter = letter;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Boolean getCorrectAnswer() {
return correctAnswer;
}
public void setCorrectAnswer(Boolean correctAnswer) {
this.correctAnswer = correctAnswer;
}
public Boolean getChecked() {
return checked;
}
public void setChecked(Boolean checked) {
this.checked = checked;
}
}
Add GSON :
dependencies {
implementation ‘com.google.code.gson:gson:2.8.6’
}
Now you just have to call these lines :
Test testdata=new Gson().fromJson(JsonString,Test.class);
testdata.getMultipleChoiceAnswers()
Upvotes: 0
Reputation: 544
1- check for "typeQuestion": "multipleChoice"
see if it contain single or muliple or input type.
2- if it contaon "multipleChoice"
then
get "multipleChoice"
convert "multipleChoice"
to JOSNObject extract each value.
3- check for other "typeQuestion"
condition parse them
4- at last add them to your list.
here is code
for (i in 0 until jsonArray.length()) {
val jsonObject = jsonArray.getJSONObject(i)
val typeQuestion = jsonObject.getString("typeQuestion"); // other keys here
Timber.d("typeQuestion $typeQuestion")// typeQuestion multipleChoice
//for multipleChoice
if(typeQuestion.contains("multipleChoice")){
val multipleChoiceAnswers = jsonObject.getJSONArray("multipleChoiceAnswers")
// run a for loop for this for this
for (sc in 0 until multipleChoiceAnswers.length()){
val currentMCA = multipleChoiceAnswers.getJSONObject(sc)
val letter = currentMCA.getString("letter")
//... extract other value for multipleChoiceAnswers
// mlist.add(multipleChoiceAnswers)
// val letter = currentMCA.getInt("id")
Timber.d("multipleChoiceAnswers size ${multipleChoiceAnswers.length()} id $letter ")
}
}
// for singleChoice
if(typeQuestion.contains("singleChoice")){
val singleChoiceAnswers = jsonObject.getJSONArray("singleChoiceAnswers")
// run a for loop for this for this
for (sc in 0 until singleChoiceAnswers.length()){
// exract singleChoiceAnswers value as multipleChoice
}
}
// for input
if(typeQuestion.contains("input")){
}
// Add all data to main list i.e test
//list.add();
}
Upvotes: 1