android - 如何从 JSON 获取嵌套的 ArrayList
问题描述
我的主数组中有三个嵌套数组。这是我的模型:
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)
而且我必须从 json 中获取数据,但我不知道如何将数据放入嵌套数组。这是我的代码:
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++
}
我的 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": []
}
解决方案
1-检查"typeQuestion": "multipleChoice"
它是否包含单个或多个或输入类型。
2-如果它包含"multipleChoice"
然后"multipleChoice"
转换"multipleChoice"
为 JOSNObject 提取每个值。
3-检查其他"typeQuestion"
条件解析它们
4-最后将它们添加到您的列表中。
这是代码
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();
}
推荐阅读
- pycharm - PyCharme IDE 问题
- laravel-5.5 - 如何通过 laravel 5.6 中的角色保护管理区域免受用户的攻击?
- android - 如何在 Android 4.4.4 或之前的版本中实现 shouldInterceptRequest
- python - 在 Pandas 中使用 pd.to_datetime 的日期不正确
- cmake - CMAKE_SYSTEM_PROCESSOR 似乎是空的。与操作系统无关的最佳策略是什么?
- java - 用于检索授权码的深度链接
- python - 熊猫:仅对一列中的选定值求和
- networking - DDS 通信是否可以在不同网络中的两台计算机之间进行?
- android - 无法从外部存储中删除位图
- dart - 飞镖颤振:调试窗口消息?