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