scala - 使用 play Json 库(或任何其他建议)对多级数组进行 JsLookup

标签 scala playframework playframework-2.0 playframework-2.2 play-json

我的函数正在接收一个 JsValue,现在这个 json 有列表,这个列表元素也可以是列表,例如:

{
  "firstName": "Elon",
  "lastName": "Musk",
  "companies": [
    {
      "name": "Tesla",
      "city": "San Francisco",
      "offices": ["sf", "ny"],
      "management": {
        "loscation": "New York",
        "boardMembers": [
          {
            "name": "John",
            "age": 45
          },
          {
            "name": "Mike",
            "age": 55
          },
          {
            "name": "Rebecca",
            "age": 35
          }
        ]
      }
    },
    {
      "name": "SpaceX",
      "city": "San Francisco",
      "offices": ["la", "ta"],
      "management": {
        "loscation": "San Mateo",
        "boardMembers": [
          {
            "name": "Lisa",
            "age": 45
          },
          {
            "name": "Dan",
            "age": 55
          },
          {
            "name": "Henry",
            "age": 35
          }
        ]
      }
    }
  ]
}

所以一个公司有管理对象,有boardMembers列表。

我的函数正在接收该元素的路径,例如:

公司[*].management.boardMembers[*].name

我希望它返回一个包含该对象所有元素的列表,因此结果将是:

[“约翰”、“迈克”、“丽贝卡”、“丽莎”、“丹”、“亨利”]

这有点复杂,但我想也许 play.api.libs.json._ 会有一些可以提供帮助的功能。

考虑拆分 pathStr.split("(\\[\\*]\\.|\\[\\*])").toList 然后迭代获取所有元素一些如何返回 JsLookupResult 但不确定如何返回。

澄清一下:

我的方法将接收 2 个参数,JsValue 和字符串形式的路径 def myFunc(json: JsValue, path: String)

每次我调用 myFunc 它都会收到不同的路径,我不确定只有在 myFunc 被调用之后它才会是什么。

最佳答案

你可以这样做:

val jsPath = JsPath \ "companies" \\ "management" \ "boardMembers" \\ "name"
val result = jsPath(Json.parse(input))
println(result)

这将打印预期的输出。参见 Scastie示例。

请注意\\\的区别:

  • \寻找直系子女
  • \\寻找递归 child

要实现 myFunc,您可以尝试这样的操作:

def findAllValuesAtPath(jsValue: JsValue, path: String): List[JsValue] = {
  val jsPath = JsPath(path
    .split("\\[\\*]\\.")
    .flatMap(s => s.split("\\.")
      .map(RecursiveSearch)
    ).toList)
  println(jsPath.path)
  jsPath(jsValue)
}

Here是另一个 scastie。

关于scala - 使用 play Json 库(或任何其他建议)对多级数组进行 JsLookup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69899039/

相关文章:

scala - 如何将csv文件转换为rdd

scala - JsValue 过滤掉空值

scala - Slick 3.0 DAO 编译失败

java - 在 EBean 和表单中保存枚举列表

scala - 如何让 Squeryl 与 Play 一起工作!框架?

scala - 没有可用于 T 的 ClassTag -- 不适用于 Array

scala - 通过隐式转换覆盖 Int 上的算术运算符

java - 拦截@Finally 和@Catch

java - 玩!框架 - 未找到公共(public)文件

playframework-2.0 - Play Framework 2.0。用两部分构建网站的更好方法