如何在 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