如何将JSON字符串映射到Kotlin Map

Ama*_*ani 4 json kotlin

我有一个简单的Kotlin程序访问Mongo数据库并生成一个JSON字符串,如下所示;

"{
     "_id" : { "$oid" : "593440eb7fa580d99d1abe85"} , 
     "name" : "Firstname Secondname" ,
     "reg_number" : "ATC/DCM/1016/230" ,
     "oral" : 11 ,
     "oral_percent" : 73 , 
     "cat_1" : 57 , 
     "cat_2" : 60 , 
     "cat_average" : 59 , 
     "assignment" : 90
}"
Run Code Online (Sandbox Code Playgroud)

我如何在Kotlin Map/MutableMap中映射这个?Kotlin中是否有API来读取JSON并将其映射到Map/MutableMap?

tyn*_*ynn 7

这可以通过Klaxon完成.有了它,您可以轻松读取实际上是的Json数据.JsonObjectMutableMap

val json: JsonObject = Parser().parse(jsonData) as JsonObject
Run Code Online (Sandbox Code Playgroud)


Aru*_*yan 7

不需要额外的库:

val jsonObj = JSONObject(jsonString)
val map = jsonObj.toMap()
Run Code Online (Sandbox Code Playgroud)

哪里 toMap 是:

fun JSONObject.toMap(): Map<String, *> = keys().asSequence().associateWith {
    when (val value = this[it])
    {
        is JSONArray ->
        {
            val map = (0 until value.length()).associate { Pair(it.toString(), value[it]) }
            JSONObject(map).toMap().values.toList()
        }
        is JSONObject -> value.toMap()
        JSONObject.NULL -> null
        else            -> value
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这看起来更像 Kotlin 式的 - 赞成。“value.toMap()”递归调用非常有趣。另外,when-是有条件的,以前从未见过。从一篇文章中学到了很多东西,每一次赞成票你至少应该得到两票赞成。 (3认同)
  • 有时 import 语句有帮助。不知道从哪里获取 JSONObject (2认同)

Mad*_*hat 5

使用 Jackson 的kotlin 模块,您可以创建一个 Map/MutableMap,如下所示:

val jsonString = "{\n" +
            "  \"_id\": {\n" +
            "    \"\$oid\": \"593440eb7fa580d99d1abe85\"\n" +
            "  },\n" +
            "  \"name\": \"Firstname Secondname\",\n" +
            "  \"reg_number\": \"ATC/DCM/1016/230\",\n" +
            "  \"oral\": 11,\n" +
            "  \"oral_percent\": 73,\n" +
            "  \"cat_1\": 57,\n" +
            "  \"cat_2\": 60,\n" +
            "  \"cat_average\": 59,\n" +
            "  \"assignment\": 90\n" +
            "}"

val map = ObjectMapper().readValue<MutableMap<Any, Any>>(jsonString)
Run Code Online (Sandbox Code Playgroud)

注意:如果您收到以下编译错误

None of the following functions can be called with the arguments supplied
Run Code Online (Sandbox Code Playgroud)

请确保您已经添加了jackson-module-kotlin(for gradle:)的依赖项,compile "com.fasterxml.jackson.module:jackson-module-kotlin:${jackson_version}"并在您使用的地方添加了readValue实现的导入import com.fasterxml.jackson.module.kotlin.readValuereadValue


Mic*_*yan 5

这可以在没有任何第三方库的情况下完成:

@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)

将 JSONObject 转换为 Map 的用法:

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

将 JSONArray 转换为 List 的用法:

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

更多信息在这里


Ale*_*hin 5

现在也可以通过以下方式实现kotlinx.serialization

import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonObject

val input = """{
     "_id" : { "some_id" : "593440eb7fa580d99d1abe85"} , 
     "name" : "Firstname Secondname" ,
     "reg_number" : "ATC/DCM/1016/230" ,
     "oral" : 11 ,
     "oral_percent" : 73 , 
     "cat_1" : 57 , 
     "cat_2" : 60 , 
     "cat_average" : 59 , 
     "assignment" : 90
}"""

val json = Json.parseToJsonElement(input)

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