无法将 JSONArray 转换为列表 (Kotlin)

use*_*369 5 parsing android json gson kotlin

这是我的字符串:

{"array":[{"message":"test1","name":"test2","creation":"test3"},{"message":"test1","name":"test2","creation":"test3"}]}
Run Code Online (Sandbox Code Playgroud)

我希望它将该数组放入 Android 版 Kotlin 应用程序中的对象列表中。我尝试使用此站点中的两个示例来完成此操作...所以这是我的代码(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)
}   
Run Code Online (Sandbox Code Playgroud)

但是我只在 x.message 中得到 null 。我不知道会出什么问题。我还尝试在各处将 arr 更改为 arr.toString() ,但这也不起作用。

JThread 也是:

object JThread {
var message: String? = null
var name: String? = null
var creation: String? = null }     
Run Code Online (Sandbox Code Playgroud)

Mic*_*yan 6

这可以在没有 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
}
Run Code Online (Sandbox Code Playgroud)

将 JSONArray 转换为 List 的用法:

val jsonArray = JSONArray(jsonArrStr)
val list = jsonArray.toList()
Run Code Online (Sandbox Code Playgroud)

将 JSONObject 转换为 Map 的用法:

val jsonObject = JSONObject(jsonObjStr)
val map = jsonObject.toMap()
Run Code Online (Sandbox Code Playgroud)

更多信息在这里


小智 0

使用此代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

PS:我用这个网站做到了: http: //www.jsonschema2pojo.org/