我有一个简单的json结构,如下所示:
{
"type": "type",
"id": "id",
"identifier": [
{
"system": "system1",
"value": "value1"
},
{
"system": "system2",
"value": "value2
}
]
}
我需要找到系统system1
的标识符值。我不能依赖标识符数组的顺序,所以我实际上需要检查system
的值。
我构建了这个用于查找的 jsonpath:$.identifier[?(@.system == 'system1')].value
,它有效。
现在我的问题是,如何将这个jsonpath与Scala Play框架一起使用?我知道里面有一个JsPath
类,但我只见过直线路径的例子,没有像我需要的那种有sibling节点的条件。而且我似乎无法从字符串中构造一个JsPath
实例。给我希望的是,文档说JsPath
类似于XML中的XPath,它确实具有Sybling节点上的条件功能。
任何帮助,不胜感激。谢谢。
类似并不意味着相同,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,)