我有一个Play框架应用程序,想要创建一个Writes
转换器,以便将某些模型转换为JSON。到目前为止我所拥有的:
implicit val locationWrites = new Writes[Board] {
def writes(board: Board) = Json.obj(
"gameSize" -> board.n,
"fields" -> Seq(FieldWithCoords((1,2,3), "field", true)) // error for this line
)
}
implicit val fieldWrites = new Writes[FieldWithCoords] {
def writes(field: FieldWithCoords) = Json.obj(
"coords" -> field.coords.toString,
"player" -> field.p,
"isHighlighted" -> field.highlighted
)
}
不幸的是,我收到错误:
类型不匹配;发现:Seq [util.FieldWithCoords]必需: play.api.libs.json.Json.JsValueWrapper注意:隐含值 locationWrites在这里不适用,因为它来自于 应用点,它没有明确的结果类型
如您所见,FieldWithCoords有转换。我怎么能解决这个问题?感谢任何帮助。谢谢。
修改
"字段"以后应该包含多个项目,因此Seq
答案 0 :(得分:3)
使用写入组合器被认为是直接创建JSON的更好实践:
implicit lazy val fieldWrites: Writes[FieldWithCoords] = (
(__ \ "coords").write[String] and
(__ \ "player").write[String] and
(__ \ "isHighlighted").write[Boolean]
).apply(field => (field.coords.toString, field.p, field.highlighted))
implicit lazy val locationWrites: Writes[Board] = (
(__ \ "gameSize").write[Int] and
(__ \ "fields").write[Seq[FieldWithCoords]]
).apply(board => (board.n, Seq(FieldWithCoords((1,2,3), "field", true))
答案 1 :(得分:2)
编译器需要隐式将Seq[FieldWithCoords]
转换为JsValueWrapper
。我能够通过提供明确的结果类型来进行编译,以便为implicits提供所需的额外微调。
implicit val fieldWrites: Writes[FieldWithCoords] = new Writes[FieldWithCoords] {
def writes(field: FieldWithCoords) = Json.obj(
"coords" -> field.coords.toString,
"player" -> field.p,
"isHighlighted" -> field.highlighted
)
}
implicit val locationWrites: Writes[Board] = new Writes[Board] {
def writes(board: Board) = Json.obj(
"gameSize" -> board.n,
"fields" -> Seq(FieldWithCoords((1,2,3), "field", true)) // error for this line
)
}