我是这两个游戏的新手! & Scala,但我正在尝试制作一个服务,将 JSON 请求映射到 Map[String,JsObject](或 Map[String,JsValue],我不确定区别),然后输出一个列表递归地通过映射(最好是树)的键。
但我有开始问题:
def genericJSONResponse = Action(parse.json) {
request => request.body
var keys = request.keys
Ok("OK")
}
我在这里期望的是用请求中的键填充键,但当然,它不会编译。鉴于上面的描述,我应该如何解决这个问题?
在此先感谢您帮助 Scala 菜鸟 :-)
尼克
最佳答案
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')
}
}
fields.toMap
是您想要的类型:Map[(String, JsValue)]
所以你可以使用 map
或 collect
递归处理对象的键。 (顺便说一句,您可以直接使用 fields
,因为它是一个 Seq[(String, JsValue)]
并且也支持 map
和 collect
)。
关于JSON 到 Map[String,JsObject] 与 Play 2.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017214/