Joo*_*ost 5 json scala playframework playframework-2.0
解析后我无法操作Json数组.
我使用post方法在Javascript中传递以下Json对象:[{"id":"someid"},{"id":"anotherid"}]
我已经使用安迪的设定(迭代数组中JSON的Play 2.1.1)来解析通过使用POST方法传递JSON编码阵列(I移动的代码到控制器为方便起见)
case class FBUser(
id: String
){}
object FBUser {
/** Uses a Scala Macro to define the Reads function */
implicit val userReads: Reads[FBUser] = Json.reads[FBUser]
implicit val fbUserFormat:Format[FBUser] = Json.format[FBUser]
}
def doQuery = Action (parse.json){ implicit request =>
val readIDFromInput = (__).read[List[FBUser]]
val IDs = request.body.validate(readIDFromInput)
IDs.map(
item => Ok(Json.toJson(item))
).recoverTotal{
err => BadRequest(JsError.toFlatJson(err))
}
}
Run Code Online (Sandbox Code Playgroud)
这应该工作:它读取并返回Json对象.我无法使用Json对象创建新变量.在这种情况下,我想构建一个像{["someid","anotherid"]}这样的Json对象(也就是说,没有"id")
首先我试过: item => Ok(Json.toJson(item.id)) // trying to access item.id
但是这导致了一个错误:value id不是object controllers.ScalaPoster.FBUser的成员
我尝试在object(def getId():String = { return this.id })中添加一个函数.访问that(item.getId())会导致相同的错误.
所有帮助都非常感谢!
编辑(没有足够的声誉回答我自己的问题):
添加另一个map函数(Json.toJson(list.map{ item => item.id })可以访问id:
case class FBUser(
id: String
)
implicit val fbUserFormat:Format[FBUser] = Json.format[FBUser]
def doQuery = Action (parse.json){ implicit request =>
var idsValid = true
var badReq = Json.obj();
val readIDFromInput = (__).read[List[FBUser]]
val listIDs = request.body.validate(readIDFromInput).map {
case list => Json.toJson(list.map{ item => item.id } )
}.recoverTotal{
e => {
idsValid = false
badReq = JsError.toFlatJson(e)
Json.arr() // empty array
}
}
if( idsValid )
Ok(listIDs)
else
BadRequest("Detected error:"+ badReq)
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助别人:)
正如您已经注意到的,您必须使用 map 两次:第一次访问 JsResult 的内容,再次访问该 JsResult 内的 List 的内容。这样,您就可以访问您正在寻找的嵌套 id,并提出一个可行的解决方案。
但是,我想指出一个相当优雅的解决方案,可以在不依赖可变状态的情况下解决您的问题:
request.body.validate(readIDFromInput) match {
case JsSuccess(users, _) => Ok(users.map(_.id))
case JsError(errors) => BadRequest(errors)
}
Run Code Online (Sandbox Code Playgroud)
我将验证与其两种可能的情况相匹配:要么它通过,我返回带有 id 列表的 200,要么它失败,我返回带有错误的 400。