我想反序列化这个json,它表示一个5x5的游戏场,并在(1,2)位置包含一个瓦片:
{
"rows" : 5,
"cols" : 5,
"tiles" : [ {
"row" : 1,
"col" : 2,
"tile" : {
"number" : 3
}
} ]
}所以我的case类是:
case class Tile(number: Int)
case class Rack(rows: Int, cols: Int, tiles: Map[(Int, Int), Tile])我试着为班级机架写了一个Reads:
implicit val tileWrites = Json.writes[Tile]
implicit val tileReads = Json.reads[Tile]
implicit val reads: Reads[Rack] = (
(__ \ "rows").read[Int] and
(__ \ "cols").read[Int] and
(__ \ "tiles").read[Map[(Int, Int), Tile]]
) (Rack.apply _)但是我得到了这个错误:
Error:(50, 26) No Json deserializer found for type Map[(Int, Int),de.htwg.se.rummi.model.model.Tile]. Try to implement an implicit Reads or Format for this type.
(__ \ "tiles").read[Map[(Int, Int), Tile]]有人能解释一下我是如何为Map(Int,Int),Tile写一个Reads的吗
发布于 2020-06-22 08:04:54
我不建议为Map这样的常见类型定义自定义Reads实例。相反,我建议为tiles定义一个自定义类型,并为此实现一个Reads。这样做的好处是,您可以将Reads实例放在伴生对象中,编译器将始终找到正确的实例,而您不必导入任何内容。
case class Tiles(tiles: Map[(Int, Int), Tile])现在您可以在伴生对象中为Tiles定义一个Reads实例:
import play.api.libs.json._
import play.api.libs.functional.syntax._
object Tiles {
implicit val reads: Reads[Tiles] =
Reads.list {
(
(__ \ "row").read[Int] and
(__ \ "col").read[Int] and
(__ \ "tile").read[Tile]
) { (row, col, tile) => ((row, col), tile) }
}.map(tuples => Tiles(tuples.toMap))
}https://stackoverflow.com/questions/62502859
复制相似问题