2016-11-27 3 views
1

これは簡単な質問である場合は謝罪してください。私はAction.asyncメソッドでJson構造体を返す必要がありますが、すでに未来のリストを埋め込む未来をどのように作成するかはわかりません。助言がありますか?Scala jsonのPlayで今後のリストを返す

case class Clazz (a: Int, b: Int) 

def index = Action.async { 
     val json = JsObject(Seq(
      "x" -> JsString("1"), 
      "list" -> Json.toJson(getList) // this line does not compile 
     )) 
     Ok(json) 
} 


def getList = Future { 
    val c1 = Clazz (1,1) 
    val c2 = Clazz (2,2) 
    val list = List(c1,c2) 
    list 
} 

UPDATE:

は以下を追加しましたが、オブジェクトを書き込みます:

implicit val cc: Writes[Clazz] = (
     (JsPath \ "a").write[Int] and 
     (JsPath \ "b").write[Int] 
) (unlift(Clazz.unapply)) 

答えて

3

あなたが期待されるコンテンツで、新しい未来を取得するためにmap機能を使用する必要があります。

def index = Action.async { 
    val eventualList: Future[List[Clazz]] = getList 
    eventualList.map { list: List[Clazz] => 
    val json = JsObject(Seq(
     "x" -> JsString("1"), 
     "list" -> Json.toJson(list) 
    )) 
    Ok(json) 
    } 
} 
+0

私は 'OK(JSON)'の行に次のエラーを取得しています: 'HTTPレスポンスにscala.concurrent.Future [play.api.libs.json.JsObject]のインスタンスを作成することができません。書き込み可能クラスを定義しようとしました[scala.concurrent.Future [play.api.libs.json.JsObject]] '書き込みクラスを追加しました(更新を参照)。まだ問題があります – ps0604

+0

私は私の答えで間違いを犯しました未来[応答]の代わりに未来を含む応答を返す)。今は修正されています。 –

3

私は通常、for/yield構文を好んでいるので、後でさらにFuturesを追加する必要がある場合は深くネストされたマップやフラットマップなしで簡単に拡張できます。

def index = Action.async { 
    for { 
     list <- getList 
    } yield { 
     val json = JsObject(Seq(
      "x" -> JsString("1"), 
      "list" -> Json.toJson(list) 
     )) 
     Ok(json) 
    } 
} 
+1

あなたの回答も役に立ちます。残念ながら私は正しい答えを1つしかマークできません – ps0604

関連する問題