我有一个Json对象,它是Json.parse的输出,格式为
{“main_data”:[{“a”:1,“b”:2},{“a”:3,“b”:4},{“a”:5,“b”:6} ]}。
我想用这个Json对象创建一个列表,其中包含所有“a”键的值。所以在上面的例子中它将是[1,3,5]。由于我是函数式编程的新手,我首先想到的是编写一个For循环并遍历Json对象以获取列表。
但我想知道有没有使用Map或flatMap进行上述操作的功能/ Scala方法?
答案 0 :(得分:2)
import play.api.libs.json._
val parsed = Json.parse("""{"main_data":[{"a":1,"b":2},{"a":3,"b":4},{"a":5,"b":6}]}""")
val keys = parsed \\ "a"
val result = keys.flatMap(_.asOpt[Int]) // List(1, 3, 5)
答案 1 :(得分:1)
你可以使用这样的东西
val json = Json.parse(yourJsonString)
val aKeys = json \\ "a"
// aKeys: Seq[play.api.libs.json.JsValue] = List(1, 3, 5)
// If you need integers instead of JsValues, just use map
val integersList = aKeys.map(x => x.as[Int])
答案 2 :(得分:1)
有很多选择。假设你有:
import play.api.libs.json._
val txt =
"""
|{ "main_data" : [ {"a" : 1, "b" :2} , {"a" : 3, "b" : 4}, {"a" : 5, "b" : 6}]}
""".stripMargin
val json = Json.parse(txt)
如果您只对a
感兴趣,请采用第一种方法:
(json \ "main_data")
.as[List[Map[String, Int]]]
.flatten
.foldLeft(List[Int]()){
case (acc, ("a", i)) => acc :+ i
case (acc, _) => acc
}
第二个更通用:
(json \ "main_data")
.as[List[Map[String, Int]]]
.flatten
.groupBy(_._1)
.map {
case (k, list) => k -> list.map(_._2)
}
.get("a")
结果是:
res0: Option[List[Int]] = Some(List(1, 3, 5))