2016-03-30 165 views
1

我要地圖這個結果查詢顯示vectorcase class斯卡拉載體案例類

DAL:

def selectPerson = sql"select * from PERSON".as[(String,String)] 

服務:

def ListPerson: Future[Seq[(String,String)]] = { 
    db.run(GroupDealerDetailDal.selectPerson) 
} 

控制器:

def listPerson = Action.async { implicit request => 
    GroupDealerDetailService.ListPerson.map(result => 
    Ok(Json.toJson(result.toString))) 
} 

案例類:

case class Person(username: String, password: String) 

object Person { 
    implicit val personFormat = Json.format[Person] 
} 

結果是Vector((prastyo,12345))

我怎麼能說結果映射到case class Person

所以結果是{"username" : "prastyo", "password" : "12345"}

回答

1

這聽起來像你想的JSON輸出,所以我懷疑內部應該是這樣的(未經測試):

GroupDealerDetailService.ListPerson.map { people => Ok(
    Json.toJson(
     people map { case (username, password) => 
      Person(username, password) 
     } 
    ) 
)} 
+0

太感謝你了,其工作 – Pras

0

如果您希望將數據庫結果映射到Json響應,則不需要額外的case class和轉換。 您可以使用Json寫入組合器的海岸到海岸設計。

簡單寫

val u: OWrites[(String, String)] = (
    (__ \ "username").write[String] and 
    (__ \ "password").write[String] 
).tupled 

地圖你(String, String)JsObject

u.writes("prastyo" -> "12345") 

res17: play.api.libs.json.JsObject = {"username":"prastyo","password":"12345"} 

隨着Writes.traversableWrites

val s = Writes.seq(u) 

你可以映射你的VectorJsArray

s.writes(Seq("prastyo" -> "12345")) 
res16: play.api.libs.json.JsValue = [{"username":"prastyo","password":"12345"}] 

完整的控制器:

def listPerson = Action.async { 
    GroupDealerDetailService.ListPerson.map(s.writes).map(Ok(_)) 
}