JSON在Play应用程序中写入转换器并不接受类型

时间:2015-01-08 00:53:22

标签: json scala playframework playframework-2.0

我有一个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

2 个答案:

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