2012-04-04 21 views
5

我是新來的玩! &斯卡拉,但我想做一個將JSON請求映射到Map [String,JsObject](或Map [String,JsValue],我不確定區分)的服務,然後輸出一個列表遞歸地通過地圖(最好是樹)的鍵。JSON映射[String,JsObject]與Play 2.0?

,但我有開始的問題:

def genericJSONResponse = Action(parse.json) { 
    request => request.body 
    var keys = request.keys 
    Ok("OK") 
} 

我希望在我們這裏是爲來填充從請求中鍵鍵,當然,它不會編譯。鑑於上面的描述,我應該如何處理這個問題?

預先感謝幫助了Scala的小白:-)

+0

你讀過這個wiki嗎? https://github.com/playframework/Play20/wiki/ScalaJsonRequests 您必須手動映射鍵或使用隱式對象將它們映射到對象。 https://github.com/playframework/Play20/wiki/ScalaJsonGenerics – 2012-04-04 19:30:58

回答

14

JsValue是所有的JSON值的基類。 JsObjectJsValue(與JsNull,JsUndefined,JsBoolean,JsNumberJsStringJsArray一起)的亞型。看看JSON規範,如果現在還不清楚:http://json.org/

如果您知道JSON體內請求是JSON對象(而不是上面列出的其他類型),您可以模式匹配它:

def genericJSONResponse = Action(parse.json) { request => 
    request.body match { 
    case JsObject(fields) => Ok("received object:" + fields.toMap + '\n') 
    case _ => Ok("received something else: " + request.body + '\n') 
    } 
} 

fields.toMap是您想要的類型:Map[(String, JsValue)]因此您可以使用mapcollect來遞歸處理對象的按鍵。 (順便說一下,您可以直接使用fields,因爲它是Seq[(String, JsValue)],並且也支持mapcollect)。

+1

謝謝,這工作得很好。 :-) – niklassaers 2012-04-04 21:34:45

+0

@niklassaers我很高興你喜歡它。 – romusz 2012-04-05 03:49:42