我是Play的新手! &安培; Scala,但我试图创建一个服务,将JSON请求映射到Map [String,JsObject](或Map [String,JsValue],我不确定区别),然后通过地图递归输出密钥列表(最好是树)。
但我有开始的问题:
def genericJSONResponse = Action(parse.json) {
request => request.body
var keys = request.keys
Ok("OK")
}
我期望这里的密钥可以填充请求中的密钥,但当然,它不会编译。鉴于上述说明,我应该如何处理这个问题?
提前感谢您帮助Scala noob: - )
的Nik
答案 0 :(得分:15)
JsValue
是所有JSON值的基类。 JsObject
是[{1}}的子类型(以及JsValue
,JsNull
,JsUndefined
,JsBoolean
,JsNumber
和{{ 1}})。如果不清楚,请查看JSON规范:http://json.org/
如果您知道正文请求中的JSON是JSON对象(与上面列出的其他类型相反),您可以对其进行模式匹配:
JsString
JsArray
属于您想要的类型: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)]
。