2017-06-01 59 views
0

最近我在工作中遇到了这个问题,并且无法弄清楚如何用Scala来实现它。我使用的是播放框架,所以我可以访问JSON库。我是新来的Scala,并想知道如何完成这个特定的任务。示例数据就是真实数据的例子。最后,我无法解决这个问题,而是在这个Scala API的PHP消费者中解析了数据。我很想改变:)如何在scala中正确创建一棵树

谢谢!


考虑下列元组:

(("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" 
     } 
     } 
    } 
    } 
} 
+1

哪里是你到目前为止的代码和你在哪里卡住?堆栈溢出不是要求别人为你编写代码的地方。 – smarx

+0

这很合理。不幸的是,我从未犯过我的企图。我很难从概念上理解如何“到达”多维地图或数组。我并不是真的在寻找某人为我写代码,我试图找出scala范式,看起来像是其他语言中相当直接的操作。 我已经添加了原来的帖子中使用的php代码。 – Jonathon

回答

3

首先,你可能不希望自己的数据是一个元组。元组用于保存静态固定数量的不同类型的值。你会更好用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) 
} 

现在,我们”再留下来合并所有的结果,对于其播放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 
+0

这就是我正在寻找的!我认为这需要我的一些分析才能完全理解。但我挖了它。谢谢! – Jonathon