使用Scala Play框架构建jsonpath

时间:2020-06-04 15:22:08

标签: json scala playframework

我有一个简单的json结构,如下所示:

{
  "type": "type",
  "id": "id",
  "identifier": [
    {
      "system": "system1",
      "value": "value1"
    },
    {
      "system": "system2",
      "value": "value2
    }
  ]
}

我需要找到系统为system1的标识符值。我不能依赖标识符数组的顺序,因此实际上我需要检查system的值。

我构建了用于查找的jsonpath:$.identifier[?(@.system == 'system1')].value,并且可以正常工作。

现在我的问题是,如何在Scala Play框架中使用此jsonpath?我知道其中有一个JsPath类,但是我只看到了带有直线路径的示例,没有一个带有像我需要的那样对节点进行索引的条件。而且我似乎无法从字符串构造一个JsPath实例。给我希望的是,documentationJsPath类似于XML中的XPath,它确实具有按节点条件的功能。

感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:3)

类比并不意味着相同,并且JsPath不提供条件路径。

import play.api.libs.json._

val js = Json.parse("""{
  "type": "type",
  "id": "id",
  "identifier": [
    {
      "system": "system1",
      "value": "value1"
    },
    {
      "system": "system2",
      "value": "value2"
    }
  ]
}""")

(js \ "identifier").validate[Seq[JsObject]].flatMap[String] { jsonIdentifiers =>
  jsonIdentifiers.filter { idObj =>
    (idObj \ "system").toOption.contains(JsString("system1"))
  }.headOption.flatMap(obj => (obj \ "value").toOption) match {
    case Some(JsString(id)) =>
      JsSuccess(id)

    case _ =>
      JsError("Missing id")
  }
}

// => JsSuccess(value1,)