2016-02-17 5 views
0

Я пытаюсь обновить код. У меня возникли проблемы с этим делом класса пытаются писать тот JSon неявных писателюPlayframework 2.4.x Json write List [(String, String)]

case class TemplateEmailMessage(recipients: List[EmailRecipient], globalEmailVars: List[(String, String)]) 

Это было так

implicit val templateEmailMessageWrites = new Writes[TemplateEmailMessage] { 
     def writes(m: TemplateEmailMessage): JsValue = { 
      val globalVars: List[JsValue] = m.globalEmailVars.map(g => Json.obj("name" -> g._1, "content" ->g._2)) 
      Json.obj(
     "to" -> m.recipients, 
     "global_merge_vars" -> JsArray(globalVars) 
      ) 
     } 
    } 

Теперь, как это. Очевидно, не работает, потому что тип второго списка поля [(String, String)]

object TemplateEmailMessage { 

    implicit val templateEmailMessageWrites: Writes[TemplateEmailMessage] = (
    (JsPath \ "to").write[List[EmailRecipient]] and 
    (JsPath \ "global_merge_vars").write[List[(String, String)]] 
)(unlift(TemplateEmailMessage.unapply)) 

} 

Я не знаю, как перевести JsArray, потому что до того, как было использовать, чтобы манипулировать значениями в записи. Я должен уйти, как старый, или есть другой способ?

Спасибо

ответ

0

Вы можете сделать это следующим образом:

object TemplateEmailMessage{ 
implicit val templateEmailMessageWrites: Writes[TemplateEmailMessage] = (
    (JsPath \ "to").write[List[EmailRecipient]] and 
    (JsPath \ "global_merge_vars").write[JsArray] 
    .contramap[List[(String, String)]](list => JsArray(list.map(g => Json.obj("name" -> g._1, "content" ->g._2)))) 
)(unlift(TemplateEmailMessage.unapply)) 
} 

Другой вариант, чтобы преобразовать (String, String) кортеж на случай класса и создать для него писатель.

case class Variable(name: String, content: String) 
object Variable{ 
implicit val variableWrites: Writes[Variable] = (
    (JsPath \ "name").write[String] and 
    (JsPath \ "content").write[String] 
)(unlift(Variable.unapply)) 
} 

И потом:

implicit val templateEmailMessageWrites: Writes[TemplateEmailMessage] = (
    (JsPath \ "to").write[List[EmailRecipient]] and 
    (JsPath \ "global_merge_vars").write[List[Variable]] 
)(unlift(TemplateEmailMessage.unapply))