解析後に 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 はオブジェクト controllers.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)
}
これが他の人に役立つことを願っています:)