我有一个简单的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?
这可以通过Klaxon完成.有了它,您可以轻松读取实际上是的Json数据.JsonObjectMutableMap
val json: JsonObject = Parser().parse(jsonData) as JsonObject
Run Code Online (Sandbox Code Playgroud)
不需要额外的库:
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)
使用 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
这可以在没有任何第三方库的情况下完成:
@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)
更多信息在这里
现在也可以通过以下方式实现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)
| 归档时间: |
|
| 查看次数: |
6992 次 |
| 最近记录: |