首页 文章

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

提问于
浏览
5

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

但我有开始的问题:

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

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

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

1 回答

  • 15

    JsValue 是所有JSON值的基类 . JsObjectJsValue 的子类型(以及 JsNullJsUndefinedJsBooleanJsNumberJsStringJsArray ) . 如果不清楚,请查看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 ) .

相关问题