【问题标题】:Iterating through a list and retrieving key-pair values [Scala/Play Framework]遍历列表并检索密钥对值 [Scala/Play 框架]
【发布时间】:2021-05-11 14:57:10
【问题描述】:

我有以下方法:

  def myMethod = {
    val myJson: String = SOME_RESPONSE.\(SOME_FIELD).get.toString()
    val allValues: List[JsValue] = Json.parse(myJson).as[List[JsValue]]
    allValues.asInstanceOf[List[String]]
  }

它返回以下内容:

List({"key1":"value1","key2":"someField","key3":"asc"}, {"key1":"anotherValue","key2":"anotherField","key3":"desc"}, {"key1":"againAnotherValue","key2":"someField","key3":"asc"})

我知道我可以使用 myMethod.head 提取列表中的第一个元素,但是我想检索列表中所有 3 个元素的 key1key2 的值,因为我需要使用它们一些匹配操作的值。

你能帮忙吗?

编辑 1

我决定让myMethod() 返回一个 List[JsValue],这样我可以执行以下操作:

myMethod.map(item => item \ KEY1_NODE).head.get

所以,这将返回头部的值,我当然可以为尾部做同样的事情,但我正在寻找一种解决方案来遍历所有 key1 键。任何的想法?我需要返回键的实际值,因此如果我使用 foreach 它将不起作用。

【问题讨论】:

  • 你永远不应该使用.head.get

标签: scala play-json


【解决方案1】:

没有案例类,你可以:

import play.api.libs.json._

val input = Json.parse("""[{"key1":"value1","key2":"someField","key3":"asc"}, {"key1":"anotherValue","key2":"anotherField","key3":"desc"}, {"key1":"againAnotherValue","key2":"someField","key3":"asc"}]""")

val reads = Reads[(String, String)] { js =>
  for {
    v1 <- (js \ "key1").validate[String]
    v2 <- (js \ "key2").validate[String]
  } yield v1 -> v2
}

input.validate(Reads.seq(reads))
// => JsSuccess(Vector((value1,someField), (anotherValue,anotherField), (againAnotherValue,someField)),)

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2014-02-11
    • 1970-01-01
    相关资源
    最近更新 更多