Всем привет!
Меня перевели на новый проект, решили делать его на Play2(Scala).
Я джавист и тяжело с моим багажом перестраиваться, прежние подходы в разработке не работают.
Долго бился на конвертированием структуры в виде кортежа со списком (List). В итоге пришел к такому варианту:
implicit val questionReads = Json.reads[Question]
implicit val questionWrites = Json.writes[Question]
implicit val answerWrites = Json.writes[Answer]
implicit val answerReads = Json.reads[Answer]
implicit val questionWithAnswersWrites = new Writes[(Option[Question], List[Answer])] {
override def writes(tuple: (Option[Question], List[Answer])) = Json.obj(
"question" -> tuple._1,
"answers" -> tuple._2
)
}
implicit val questionWithAnswerReads = new Reads[(Question, List[Answer])] {
override def reads(json: JsValue) = JsSuccess((
(json \ "question").as[Question],
(json \ "answers").as[List[Answer]]
))
}
def questionWithAnswers(id: Long) = Action {
val answers: (Option[Question], List[Answer]) = questionService.questionWithAnswers(id)
Ok(Json.toJson(answers))
}
def saveWithAnswers = Action(BodyParsers.parse.json) { implicit request =>
request.body.validate[(Question,List[Answer])].fold(
error => {
BadRequest(Json.obj("status" -> JsError.toJson(error)))
},
tuple => {
questionService.update(tuple._1,tuple._2)
Ok(Json.obj("status" -> "success"))
}
)
}
Question и Answer - это case class'ы