我有一个简单的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
实例。给我希望的是,documentation说JsPath
类似于XML中的XPath,它确实具有按节点条件的功能。
感谢您的帮助。谢谢。
答案 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,)