如何在 Scala 中正确创建树
How to properly create a tree in scala
我最近在工作中遇到了这个问题,不知道如何用 Scala 来完成它。我正在使用 play 框架,所以我可以访问 JSON 库。我是 Scala 的新手,想知道如何完成这个特定任务。示例数据是真实数据的示例。
最后,我无法解决这个问题,而是在这个 Scala API 的 PHP 消费者中解析数据。我很想改变它:)
谢谢!
给定以下元组:
(("GET","a/b/c"),("POST","a/c/d"),("POST","f/e/x/r"),("GET","a/c/f/f"))
生成以下内容JSON:
{
"a": {
"b": {
"c": {
"GET" : "GET"
}
},
"c": {
"d": {
"POST": "POST"
},
"f": {
"f": {
"GET": "GET"
}
}
}
},
"f": {
"e": {
"x": {
"r": {
"POST": "POST"
}
}
}
}
}
首先,您可能不希望数据位于元组中。元组用于将不同类型的值保存在一个静态固定的数字中。使用 List[(String, String)]
会更好,它允许您添加任意数量的路由(而您的示例卡在 4)
接下来,如果路径中有不同的段,则需要递归嵌套对象。使用 foldRight
:
可以很容易地完成此操作
def nestedObjects(inside: JsObject, nesters: Seq[String]): JsObject =
nesters.foldRight(inside)((nester, in) => Json.obj(nester -> in)
现在,我们需要从给定的路径中提取嵌套者列表,并定义内部对象:
def treatPair(method: String, path: String): JsObject = {
val nesters = path.split("/")
val inside = Json.obj(method -> method)
nestedObjects(inside, nesters)
}
现在,我们要合并所有结果,play-json 已经有一个方法:deepMerge
def reduceList(routes: List[(String, String)]): JsObject = {
routes.map {
case (method, path) => treatPair(method, path) //apply treatPair on each pair
}.fold(Json.obj())(_ deepMerge _) //merge them two-by-two
我最近在工作中遇到了这个问题,不知道如何用 Scala 来完成它。我正在使用 play 框架,所以我可以访问 JSON 库。我是 Scala 的新手,想知道如何完成这个特定任务。示例数据是真实数据的示例。
最后,我无法解决这个问题,而是在这个 Scala API 的 PHP 消费者中解析数据。我很想改变它:)
谢谢!
给定以下元组:
(("GET","a/b/c"),("POST","a/c/d"),("POST","f/e/x/r"),("GET","a/c/f/f"))
生成以下内容JSON:
{
"a": {
"b": {
"c": {
"GET" : "GET"
}
},
"c": {
"d": {
"POST": "POST"
},
"f": {
"f": {
"GET": "GET"
}
}
}
},
"f": {
"e": {
"x": {
"r": {
"POST": "POST"
}
}
}
}
}
首先,您可能不希望数据位于元组中。元组用于将不同类型的值保存在一个静态固定的数字中。使用 List[(String, String)]
会更好,它允许您添加任意数量的路由(而您的示例卡在 4)
接下来,如果路径中有不同的段,则需要递归嵌套对象。使用 foldRight
:
def nestedObjects(inside: JsObject, nesters: Seq[String]): JsObject =
nesters.foldRight(inside)((nester, in) => Json.obj(nester -> in)
现在,我们需要从给定的路径中提取嵌套者列表,并定义内部对象:
def treatPair(method: String, path: String): JsObject = {
val nesters = path.split("/")
val inside = Json.obj(method -> method)
nestedObjects(inside, nesters)
}
现在,我们要合并所有结果,play-json 已经有一个方法:deepMerge
def reduceList(routes: List[(String, String)]): JsObject = {
routes.map {
case (method, path) => treatPair(method, path) //apply treatPair on each pair
}.fold(Json.obj())(_ deepMerge _) //merge them two-by-two