在Scala中将JSON对象转换为特定键的值列表(播放)

时间:2016-07-19 20:23:26

标签: json scala dictionary playframework

我有一个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方法?

3 个答案:

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