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

时间:2018-08-10 18:08:54

标签: json scala jackson

我有以下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"
  }
}

1 个答案:

答案 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)))

未测试