Карта с несколькими ключами и значениями - PullRequest
1 голос
/ 23 февраля 2020

Я создаю приложение для викторины в Kotlin, где есть вопрос с 2 или 5 вариантами ответов вместе с оценками. Таким образом, есть номер вопроса, вопрос, ответы и баллы для каждого ответа. Я сделал приложение во флаттере, где я использовал карту с одним ключом (номер вопроса: вопрос) и другим ключом (вариант ответа: оценка). В ответе использовался список для нескольких вариантов. Как лучше всего это сделать в Kotlin?

Код флаттера

{
      'Question 1': 'Do you ...?',
      'answers': [
        {'text': 'Not at all', 'score': 0},
        {'text': 'Partly', 'score': 50},
        {'text': 'Mostly', 'score': 280},
        {'text': 'Completely', 'score': 500},
      ],
    },

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Спасибо Лене Бру за оригинальный ответ, в котором, к сожалению, было несколько ошибок. Это должна быть рабочая версия, которая отвечает на ваш вопрос:

классы данных:

data class Answer(
    @SerializedName("text") val text: String = "",
    @SerializedName("score") val score: Int = 0
)

data class Question(
    @SerializedName("Question") val questionText: String = "",
    val answers: List<Answer> = listOf()
)

json data:

val json = """
[
    {
        "Question": "Why?",
        "answers": [
            {
                "text": "Because I said so",
                "score": 10
            },
            {
                "text": "Dunno",
                "score": 20
            }
        ]
    }
]
"""

И, наконец, парсинг json и его отображение:

val gson = Gson()
val questions: List<Question> = gson.fromJson(json, object : TypeToken<List<Question?>?>() {}.type)


questions.forEach { question ->
    println("The question is: ${question.questionText}")
    println("The answers are:")
    question.answers.forEach {answer ->
        println("    Text: ${answer.text}, score: ${answer.score}")
    }
}

Основные отличия от предыдущего ответа:

  • изменено json для соответствия классам данных
  • json теперь строка
  • Исправлено отображение кода

Надеюсь, это поможет и по-прежнему актуально.

1 голос
/ 23 февраля 2020
data class Answer(@SerializedName("text") val text: String = "", @SerializedName("score") score: Int = 0)

data class Question(@SerializedName("Question") val questionText: String = "", answers: List<Answer> = listOf())

На мой взгляд, ваша json структура не является хорошей, потому что у вас есть номер внутри ключа вопроса, т.е. "Вопрос 1"

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

json = [
   { "Question": "why is blabla a blabla?",
     "answers": ["because I said so", "who knows?", "It doesnt matter"]
    },
    { "Question": "Is this a second question because it is an array of questions?",
      "answers": ["Yes", "No", "White", "Black"]
    }
]

Когда вы вводите это json через gson, например (общий google json парсер)

val questions: List<Question> = gson.fromJson(json,TypeToken<List<Question>(){}.type)


 questions.forEach { question ->
    Log.d("TAG","The question is:${question.questionText}"
    Log.d("TAG","The answers are: ${question.answers.contentToString()}"
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...