2012-04-04 66 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