Как получить массив данных json из API - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю в Android studio и использую Kotlin. Я пытаюсь получить json данные из открытой базы данных пустяков . Это мои классы для обработки запроса и ответа:

class TriviaRequest (

    val results: List<TriviaResult>
)

class TriviaResult(

    val category: String,
    val type: String,
    val question: String,
    val correct_answer: String,
    val incorrect_answer: List<String>
)

Вот как выглядят данные json:

{"response_code":0,"results":[{"category":"General 
Knowledge","type":"multiple","difficulty":"easy","question":"What is the nickname of the US state of 
California?","correct_answer":"Golden State","incorrect_answers":["Sunshine State","Bay 
State","Treasure State"]}]}

И вот мой код для извлечения данных:

 private fun fetch(){

    Log.d("fetch", "fetching")
    val url = "https://opentdb.com/api.php?amount=1&type=multiple"
    Log.d("url", "url='" + url + "'")
    val request = Request.Builder()
        .url(url)
        .build()
    Log.d("request", request.toString())
    Log.d("client", client.toString())
    client.newCall(request).enqueue(object: Callback {

        override fun onResponse(call: Call, response: Response) {

            val body = response.body?.string()
            Log.d("body", body)
            val gson = GsonBuilder().create()
            val triviaRequest = gson.fromJson(body, TriviaRequest::class.java)
            val result = triviaRequest.results[0]
            val question = result.question.toSpanned()
            Log.d("question", question.toString())
            val questionCategory = result.category.toSpanned()
            Log.d("category", questionCategory.toString())
            val correctAnswer = result.correct_answer.toSpanned()
            Log.d("correct", correctAnswer.toString())
            try {
                val incorrectAnswers = result.incorrect_answer[0].toSpanned()
                Log.d("incorrect", incorrectAnswers.toString())

            } catch (e: Exception) {
                e.printStackTrace()
            }

            override fun onFailure(call: Call, e: IOException) {
                e.printStackTrace()
            }

Это моя функция toSpanned:

fun String.toSpanned() : Spanned {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
    } else {
        @Suppress("DEPRECATION")
        return Html.fromHtml(this)
    }
}

Мой вопрос , категория и правильный ответ работает нормально но когда исполняется этот код:

val неверный ответ W / System.err: java .lang.NullPointerException: попытка вызвать метод интерфейса 'java .lang.Object java .util.List.get (int)' для нулевого объекта ссылка

Что я делаю не так? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...