5

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

但我有开始问题:

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

我在这里期望的是用请求中的密钥填充密钥,但当然,它不会编译。鉴于上述描述,我应该如何处理这个问题?

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

尼克

4

1 回答 1

16

JsValue是所有 JSON 值的基类。JsObjectJsValue(与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')
  }
}

fields.toMap是您想要的类型:Map[(String, JsValue)]因此您可以使用maporcollect递归地处理对象的键。(顺便说一句,你可以fields直接使用,因为它是 a和Seq[(String, JsValue)]支持的)。mapcollect

于 2012-04-04T20:05:23.437 回答