解析 Json 数组后,我无法操作它。
我使用 post 方法在 Javascript 中传递以下 Json 对象: [{"id":"someid"},{"id":"anotherid"}]
我使用了 Andy 的设置(使用 Play 2.1.1 对 JSON 中的数组进行迭代)来解析使用 post 方法传递的 json 编码数组(为方便起见,我将代码移到了控制器中)
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))
}
}
这可以正常工作:它读取并返回 Json 对象。我无法使用 Json 对象创建新变量。在这种情况下,我想构造一个像 {["someid", "anotherid"]} 的 Json 对象(即没有“id”)
首先我试过:item => Ok(Json.toJson(item.id)) // trying to access item.id
但这导致了一个错误:值 id 不是对象控制器的成员。ScalaPoster.FBUser
我尝试向对象 ( def getId():String = { return this.id }
) 添加一个函数。访问该 ( item.getId()
) 会导致相同的错误。
非常感谢所有帮助!
编辑(没有足够的声誉来回答我自己的问题):
添加另一个映射函数 ( 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)
}
希望这可以帮助其他人:)