在 Scala 中获取映射中键的值

问题描述 投票:0回答:1

我是scala新手,仍然需要学习很多东西。但目前我有这个 json 对象:

driverCarJSON = """{
    "collection": {
        "listing": [ 
        ],
        "cars": ["bmw", "ford", "vw"]
        ,
        "carDriverMap" :[{"car1":"driver1"},
        {"car2":"driver2"},
        {"car3":"driver3"},
        {"car4":"driver4"},
        {"car5":"driver5"}]
    }
}"""

我正在尝试访问 carDriverMap 中键的值。 因此,如果我想要“car2”的值,它应该返回“driver2”

现在,我正在使用这个解析这个 json:

scala.util.parsing.json.JSON.parseFull(driverCarJSON)

这回来了

Some(Map(collection -> Map(listing -> List(), cars -> List(bmw, ford, vw), carDriverMap -> List(Map(car1 -> driver1), Map(car2 -> driver2), Map(car3 -> driver3), Map(car4 -> driver4), Map(car5 -> driver5)))))

我被困在这里我该怎么办?

我已经看到这个使用函数的解决方案

def getValue(parsedJson : Option[Any] , key:String): String ={
  parsedJson match {
    case Some(m : Map[String,Any]) => m(key) match {
      case d:String => d
    }
  }
}

然后称其为

getValue(driverCarJSON , carDriverMap["collection"][2]["car2"])
但当我打印它时,什么也没有打印出来。

谢谢

json scala dictionary key
1个回答
2
投票

2024 年更新

如果您不关心 2.11 中的内容,请考虑使用例如


2018年的原始答案

这适用于 2.11 和单独的解析器组合器依赖项:

val driverCarJSON = """{
    "collection": {
        "listing": [ 
        ],
        "cars": ["bmw", "ford", "vw"]
        ,
        "carDriverMap" :[{"car1":"driver1"},
        {"car2":"driver2"},
        {"car3":"driver3"},
        {"car4":"driver4"},
        {"car5":"driver5"}]
    }
}"""

val parsedJson = scala.util.parsing.json.JSON.parseFull(driverCarJSON).get
val d2 = parsedJson
  .asInstanceOf[Map[String, Any]]
  .apply("collection")
  .asInstanceOf[Map[String, Any]]
  .apply("carDriverMap")
  .asInstanceOf[List[Map[String, String]]]
  .apply(1)("car2")
  
println(d2) // output: driver2

但我个人认为 API 并没有经过深思熟虑。我找不到任何方法来避免所有丑陋和不必要的

asInstanceOf
。这已经被弃用很久了,所以请考虑使用像
json4s
这样的新东西,它不会受到重复的
asInstanceOf
s 的影响。

© www.soinside.com 2019 - 2024. All rights reserved.