2013-07-29 9 views
5

解析した後にJson配列を操作するのに問題があります。Play 2.1.1を使用したJSONでの配列の繰り返しと再フォーマット

Iは、POSTメソッドを使用してJavaScriptで以下のJSONオブジェクトを渡す:[{ "ID": "someid"}、{ "ID": "anotherid"}]私はアンディのセットアップを使用している

Iterating over an array in JSON with Play 2.1.1) 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)) 
    } 

    } 

(Iは便宜上コントローラにコードを移動):それは読み出してJSONオブジェクトを返します。新しい変数を作成するためにJsonオブジェクトを使用するのに問題があります。この場合、Iは{[ "someid"、 "anotherid"]}(すなわち、 "ID" なし、である)

まずなどJSONオブジェクトを構築したい私が試した:item => Ok(Json.toJson(item.id)) // trying to access item.id

しかし、これは生じましたエラー:値IDはオブジェクトコントローラのメンバーではありません.ScalaPoster.FBUser

オブジェクトに関数を追加しようとしました(def getId():String = { return this.id })。その(item.getId())にアクセスすると、同じエラーが発生します。

すべてのサポートは高く評価されています。

編集(足りない評判自分の質問に答えるために):これは他の人:)

答えて

0
を助けるかもしれない

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)   
    } 

希望:

は、別のマップ機能(Json.toJson(list.map{ item => item.id })を追加するには、IDへのアクセスを提供します

すでに気付いたように、JsResultのコンテンツに初めてアクセスし、そのJsResult内のListのコンテンツに再度アクセスするために、地図を2回使用する必要がありました。この方法で、探していたネストされたIDにアクセスし、実行可能なソリューションを思いつきました。

しかし、私は変更可能な状態に依存することなく、あなたの問題を解決し、かなりエレガントなソリューションを指摘したいと思います:

request.body.validate(readIDFromInput) match { 
    case JsSuccess(users, _) => Ok(users.map(_.id)) 
    case JsError(errors) => BadRequest(errors) 
} 

私はその2つの可能なケースに検証を一致させる:それは通過して、私は返すのいずれかidsのリストを持つ200、または失敗し、エラーがある400を返します。

関連する問題