1

我最近在工作中遇到了这个问题,并且无法弄清楚如何使用 Scala 来完成它。我正在使用播放框架,所以我可以访问 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"
        }
      }
    }
  }
}
4

1 回答 1

4

首先,您可能不希望您的数据位于元组中。元组用于以静态固定的数字保存不同类型的值。您最好使用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
于 2017-06-01T20:44:28.897 回答