【问题标题】:Building jsonpath with Scala Play framework使用 Scala Play 框架构建 jsonpath
【发布时间】:2020-06-04 15:22:08
【问题描述】:

我有一个像这样的简单 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 类,但我只看到了带有直线路径的示例,没有一个像我需要的那样具有sybling 节点的条件。而且我似乎无法用字符串构造 JsPath 实例。让我希望的是,documentation 表示 JsPath 类似于 XML 中的 XPath,它确实具有条件-sybling-node 功能。

感谢任何帮助。谢谢。

【问题讨论】:

  • 你自己尝试过什么?
  • 因为我在项目的其他地方使用了 jsonpath,所以我试图坚持这种方法,但现在我看到我必须放手了。当然,如果我将 json 转换为 Scala 对象,我可以轻松地做我想做的事情......使用 jsonpath 会很漂亮。

标签: json scala playframework


【解决方案1】:

类似并不意味着相同,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,)

【讨论】:

  • 感谢您确认 JsPath 中没有条件路径。感谢您提供示例代码,尽管我想我会寻找更简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2019-04-11
  • 2016-08-17
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多