Playframework 2.4.x Json write List[(String, String)]



我正在尝试更新一些代码。我在尝试编写 json 隐式编写器时遇到此问题

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

现在就是这样。显然不起作用,因为第二个字段列表的类型[(字符串,字符串)]

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,因为在使用它来操作编写器中的值之前。我应该像以前一样离开还是有另一种方式?

谢谢

你可以

这样做:

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

另一种选择是将(字符串,字符串)元组转换为案例类并为其创建编写器。

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

最新更新