首页 > 解决方案 > 如何从 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": []
    }

标签: androidkotlin

解决方案


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


        }

推荐阅读