Не удается преобразовать JSONArray в список (Kotlin)

Это моя строка:

{"array":[{"message":"test1","name":"test2","creation":"test3"},{"message":"test1","name":"test2","creation":"test3"}]}

И я хочу, чтобы этот массив попал в список объектов в приложении Kotlin для Android. Я попытался сделать это, используя два примера с этого сайта... Итак, вот мой код (res = эта строка):

val gson = Gson()
val obj = gson.fromJson(res, JsonObject::class.java)
val arr = obj.getAsJsonArray("array")

println(arr.toString())
val list1 : List<JThread> = gson.fromJson(arr, object : TypeToken<List<JThread>>() {}.type)
val list2 = gson.fromJson(arr, Array<JThread>::class.java).asList()

for (x in list1){
   println(x.message)
}
for (x in list2){
   println(x.message)
}   

Однако я получаю только null в x.message. Я не знаю, что может пойти не так. Я также пытался везде изменить arr на arr.toString(), и это тоже не сработало.

Также JThread:

object JThread {
var message: String? = null
var name: String? = null
var creation: String? = null }     
2
0
5 723
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте этот код:

import com.google.gson.annotations.SerializedName
import com.google.gson.Gson

data class Array(
    @SerializedName("message")
    var message: String,
    @SerializedName("name")
    var name: String,
    @SerializedName("creation")
    var creation: String
)

data class Example(
    @SerializedName("array")
    var array: List<Array>? = null
)

private fun fromJson(json:String):Example{
    return Gson().fromJson<Example>(json, Example::class.java)
}

PS: я сделал это с помощью этого сайта: http://www.jsonschema2pojo.org/

Я изменил эту строку «var array: List<Array>? = null» на «var array: Array<JThread>? = null», и она отлично работает. Большое спасибо!

user2369 30.05.2019 21:34

Плагин «JSON to Kotlin class» также отлично выполняет преобразование. plugins.jetbrains.com/plugin/…

fangzhzh 30.05.2019 21:57

Круто, будем пробовать. Спасибо за совет!

samaromku 30.05.2019 22:07

Это можно сделать без GSON или любой другой сторонней библиотеки:

@Throws(JSONException::class)
fun JSONObject.toMap(): Map<String, Any> {
    val map = mutableMapOf<String, Any>()
    val keysItr: Iterator<String> = this.keys()
    while (keysItr.hasNext()) {
        val key = keysItr.next()
        var value: Any = this.get(key)
        when (value) {
            is JSONArray -> value = value.toList()
            is JSONObject -> value = value.toMap()
        }
        map[key] = value
    }
    return map
}

@Throws(JSONException::class)
fun JSONArray.toList(): List<Any> {
    val list = mutableListOf<Any>()
    for (i in 0 until this.length()) {
        var value: Any = this[i]
        when (value) {
            is JSONArray -> value = value.toList()
            is JSONObject -> value = value.toMap()
        }
        list.add(value)
    }
    return list
}

Использование для преобразования JSONArray в список:

val jsonArray = JSONArray(jsonArrStr)
val list = jsonArray.toList()

Использование для преобразования JSONObject в карту:

val jsonObject = JSONObject(jsonObjStr)
val map = jsonObject.toMap()

Дополнительная информация: здесь.

Другие вопросы по теме