Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在Scala中获取映射中键的值_Json_Scala_Dictionary_Key - Fatal编程技术网

Json 在Scala中获取映射中键的值

Json 在Scala中获取映射中键的值,json,scala,dictionary,key,Json,Scala,Dictionary,Key,我是scala的新手,仍然需要学习很多东西。但目前我有一个json对象: driverCarJSON = """{ "collection": { "listing": [ ], "cars": ["bmw", "ford", "vw"] , "carDriverMap" :[{"car1":"driver1"}, {"car2":"driver2"}, {"car3":"d

我是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”])
但是当我打印它时,什么都不会被打印出来


谢谢

这里使用的是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并没有经过很好的考虑。我找不到任何方法来避免所有丑陋和不必要的
a替代
s。这是很久以前就不赞成的了,所以请考虑使用一些新的东西,如<代码> JSON4S ,它不受重复<代码> < <代码> S.< /P>的影响,这是什么样的Scala版本?此软件包在
2.11
中是否已被弃用?您是否尝试改用
json4s
?关于
json4s
,我一点都不记得了,这表明它没有引起任何问题。嗯,为什么版本会那么重要?问题是如何访问该键当然,
getValue(driverCarJSON,“car2”)
不起作用。JSON中没有键
“car2”
,只有一个键
“collection”
。这与“Scala的复杂性”无关。如果你用任何其他语言尝试了
driverCarJSON[“car2”]
,它也不会起作用。你是对的,我的错误复制过来了-你有什么建设性的批评吗?另外,
driverCarJSON[“collection”][“carDriverMap”][“car5”]
也不会起作用,因为尽管名字有误导性,
carDriverMap
不是地图,而是序列。看起来问题与Scala无关,更多的是因为您不了解JSON的结构。谢谢。让我试试这个。我甚至不知道这是不赞成的,这是多么新的我对这个scala的事情。我绝对可以使用json4s,你介意在这里展示一下如何使用它吗?。你是对的,这个API看起来很复杂。不过我接受你的帖子作为答案。你可能想看一看。在您的具体案例中,它应该类似于
((parsedJson\'collection\'carDriverMap”)(1))\'car2”)。提取[String]
,但还有其他语法风格,查看更多示例。实际上,在接受的答案中运行代码时,我会遇到此错误:
java.lang.ClassCastException:scala。有些无法转换为scala.collection.immutable.Map
-有什么想法吗?@uniXVanXcel如果您遇到此异常,则您不会从答案中运行代码。您可能只运行以
val d2=…
开头的最后一部分,但您忘记了前一行中的
get
。如果您不想
获取
,则必须对
Some/None
进行模式匹配。