2017-06-01 51 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