使用Play 2.0映射[String,JsObject]的JSON?

nik*_*ers 5 json scala playframework playframework-2.0

我是Play的新手!&Scala,但我正在尝试创建一个服务,将JSON请求映射到Map [String,JsObject](或Map [String,JsValue],我不确定区别),然后输出一个列表密钥递归地通过地图(最好是树).

但我有开始的问题:

def genericJSONResponse = Action(parse.json) {
  request => request.body
  var keys = request.keys
  Ok("OK")
}
Run Code Online (Sandbox Code Playgroud)

我期望这里的密钥是从请求中填充密钥,但当然,它不会编译.鉴于上述说明,我该如何处理?

在此先感谢您帮助Scala noob :-)

rom*_*usz 15

JsValue是所有JSON值的基类.JsObject是的一个亚型JsValue(具有沿JsNull,JsUndefined,JsBoolean,JsNumber,JsString,和JsArray).如果不清楚,请查看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')
  }
}
Run Code Online (Sandbox Code Playgroud)

fields.toMap是你想要的类型:Map[(String, JsValue)]所以你可以递归地使用mapcollect处理对象的键.(顺便说一句,你可以fields直接使用,因为它是一个Seq[(String, JsValue)]并支持map并且collect也是如此).