Scala:使用 find() 或 filter() 基于多个键值读取映射的内部映射



我有 3 个 json,如下所示,从 Json 1 对象中我需要从"设备"映射中获取"设备名称"的值,如果"设备"映射不存在,那么我需要从"接口"映射中获取"设备名称"的值。

从 Json 2 对象中,我需要从"接口"映射中获取"设备名称"的值,从 Json 3 对象中,我需要从"段"映射中获取"段设备名称"的值。

我可能会从前端获得这 3 个 json 中的任何一个,如何在 Scala 中通过将 json 转换为 map 并使用最少的行数来优雅地实现这一目标,例如通过使用 Scala map 的 find(( 或 filter(( 函数

我正在使用org.json4s.jackson.JsonMethods.parse(request.getContent).extract[Map[String, Any]]将json转换为map,因为内部map可能再次映射我使用任何 杰森 1:

{
"device": {
"device-name": "scala",
"payment" : {
"test": "x"
}
},
"interface": {
"device-name": "java"
}
}

杰森 2:

{
"interface": {
"device-name": "java"
}
}

杰森 3:

{
"segment": {
"segment-device-name": "java"
}
}

如果你解析为Map[String, Map[String, String]]那么你可以,对于地图 m ...

val keys = List(
("device", "device-name"),
("interface", "device-name"),
("segment", "segment-device-name")
)
val ans = for {
(ko, ki) <- keys
v <- m.get(ko)  // get inner map if exists, else go to next k, v pair
} yield v(ki)
ans(0)  //  0 index ensures we get "device" if exists before "interface"

这将脱糖以映射和平面映射为...

val ans = keys.flatMap(case (ko, ki) => m.get(ko).map(v => v(ki)))

未测试

最新更新