我有以下3个json,从Json 1对象中,我需要从“设备”映射中获取“设备名称”的值,如果“设备”映射不存在,那么我需要获取“设备名称”的值从“界面”地图中获取。
从Json 2对象中,我需要从“接口”映射中获取“设备名称”的值,从Json 3对象中,我需要从“细分”映射中获取“ segment-device-name”的值。
我可能会从前端获得这3个json中的任何一个,如何在Scala中以优雅的方式通过将json转换为map并使用最少的行数来实现此目标,例如使用Scala map的find()或filter()函数
我正在使用org.json4s.jackson.JsonMethods.parse(request.getContent).extract[Map[String, Any]]
将json转换为map,因为innermap可能会再次被映射,所以我使用Any
杰森1:
{
"device": {
"device-name": "scala",
"payment" : {
"test": "x"
}
},
"interface": {
"device-name": "java"
}
}
杰森2:
{
"interface": {
"device-name": "java"
}
}
杰森3:
{
"segment": {
"segment-device-name": "java"
}
}
答案 0 :(得分:0)
如果您解析为Map[String, Map[String, String]]
,则可以为Map 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"
这将把地图和flatMap降糖为...
val ans = keys.flatMap(case (ko, ki) => m.get(ko).map(v => v(ki)))
未测试