【问题标题】:Converting a JSON object to a value list of a particular key in scala (play)将 JSON 对象转换为 scala 中特定键的值列表(播放)
【发布时间】:2016-11-22 21:32:36
【问题描述】:

我有一个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 方式来执行上述操作?

【问题讨论】:

  • 你可以让case classes匹配你的JSON格式并直接解析。然后提取您的a 值,请参阅here

标签: json scala dictionary playframework


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    你可以使用这样的东西

    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])
    

    【讨论】:

      【解决方案3】:

      有很多选择。假设您有:

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

      【讨论】:

        猜你喜欢
        • 2013-03-08
        • 2013-01-11
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 2017-10-26
        • 2014-04-04
        • 2020-07-11
        • 2021-10-09
        相关资源
        最近更新 更多