首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala:使用find()或filter()根据多个键值读取映射的内部映射

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

Stack Overflow用户
提问于 2018-08-10 18:08:54
回答 1查看 430关注 0票数 0

我有3个json's,从Json 1对象中,我需要从“设备”映射中获得“设备名称”的值,如果“设备”映射不在那里,那么我需要从“接口”映射中获得“设备名称”的值。

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

我可能从前端获得这3条json中的任何一条,如何在Scala中以优雅的方式实现这一点,方法是将json转换为map并使用最少的行数,例如使用Scala映射的find()或filter()函数

我使用org.json4s.jackson.JsonMethods.parse(request.getContent).extract[Map[String, Any]]将json转换为map,因为innermap可能再次映射,所以我使用任何Json 1:

代码语言:javascript
复制
{
  "device": {
    "device-name": "scala",
    "payment" : {
       "test": "x"
     }
   },
  "interface": {
    "device-name": "java"
  }
}

Json 2:

代码语言:javascript
复制
{
  "interface": {
    "device-name": "java"
  }
}

Json 3:

代码语言:javascript
复制
{
  "segment": {
    "segment-device-name": "java"
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-10 18:45:27

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

代码语言:javascript
复制
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成为.

代码语言:javascript
复制
val ans = keys.flatMap(case (ko, ki) => m.get(ko).map(v => v(ki)))

未测试

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51791926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档