Это моя строка:
{"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 }
Используйте этот код:
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/
Плагин «JSON to Kotlin class» также отлично выполняет преобразование. plugins.jetbrains.com/plugin/…
Круто, будем пробовать. Спасибо за совет!
Это можно сделать без 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()
Дополнительная информация: здесь.
Я изменил эту строку «var array: List<Array>? = null» на «var array: Array<JThread>? = null», и она отлично работает. Большое спасибо!