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

时间:2017-07-02 12:44:44

标签: 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
}"

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

3 个答案:

答案 0 :(得分:6)

可以使用Klaxon完成此操作。有了这个,您可以轻松地将 Json 数据读作JsonObject,这实际上是MutableMap

val json: JsonObject = Parser().parse(jsonData) as JsonObject

答案 1 :(得分:5)

使用杰克逊的kotlin module,您可以创建一个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)

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

None of the following functions can be called with the arguments supplied

请确保您已添加jackson-module-kotlin的依赖项(对于gradle:compile "com.fasterxml.jackson.module:jackson-module-kotlin:${jackson_version}")并将 readValue 实现的导入添加为import com.fasterxml.jackson.module.kotlin.readValue在您使用readValue

的地方

答案 2 :(得分:-1)

不需要其他库:

val jsonObj = JSONObject(jsonString)
val map = jsonObj.toMap()

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
    }
}