【问题标题】:Map values of JsonNode arrays in Kotlin在 Kotlin 中映射 JsonNode 数组的值
【发布时间】:2019-06-05 04:48:25
【问题描述】:

我有两个 JsonNode 对象,它们是从 API 调用返回的数组,看起来像这样

exportedNodeArray:

[
    {"key":"111", "value":"aaa"},
    {"key":"222", "value":"bbb"},
    {"key":"333", "value":"ccc"}
]

本地节点数组

[
    {"key":"999", "value":"aaa"},
    {"key":"888", "value":"bbb"},
    {"key":"777", "value":"ccc"}
]

所需的输出是对应于每个数组中相同值的任何键的映射。保证数组中的值是唯一的。

"111"="999"
"222"="888"
"333"="777"

此函数返回正确的结果,但似乎是一种非常不优雅的方式。

fun mapIds(exportedNodeArray: JsonNode, localNodeArray: JsonNode) : MutableMap<String, String?> {
    val localMap = mutableMapOf<String, String>()
    localNodeArray.forEach {
        localMap[it["value"].asText()] = it["key"].asText()
    }
    val idMap = mutableMapOf<String, String?>()
    exportedNodeArray.forEach {
        idMap[it["key"].asText()] = localMap[it["value"].asText()]
    }
    return idMap
}

我是 Kotlin 的新手,想了解一种更实用的方法。特别是如果有一种方法可以通过属性值访问 JsonNode 的元素,并在单个循环或映射调用中完成此操作。

【问题讨论】:

    标签: kotlin jackson


    【解决方案1】:

    如果你再定义一个函数,它可能看起来像这样:

    fun mapIds(exportedNodeArray: JsonNode, localNodeArray: JsonNode) : Map<String, String> {
        val localConverted = convert(localNodeArray)
        return convert(exportedNodeArray)
            .filterKeys(localConverted::containsKey)
            .map { it.value to localConverted.getValue(it.key) }
            .toMap()
    }
    
    fun convert(node: JsonNode): Map<String, String> = node.associate {
        it["value"].asText() to it["key"].asText() 
    }
    

    【讨论】:

    • 谢谢,我不熟悉“关联”功能,在这种情况下效果很好。我把函数体改成这样:val localMap = localNodeArray.associate { it[“value”].asText() to it[“key”].asText() }return exportedNodeArray.associate { it[“key”].asText() to localMap[it[“value”].asText()] }
    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2019-01-16
    相关资源
    最近更新 更多