我正在尝试更新一些代码。我在尝试编写 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))