我们说我有
trait T
case class A(s: String) extends T
case class B(s: String, i: Int) extends T
我需要能够序列化List[T]
宣布后
implicit val aWrites = Json.writes[A]
implicit val bWrites = Json.writes[B]
我试着
val list = List(A("1"), B("2", 2))
Json.toJson(list)
但是编译器说
找不到类型T的Json序列化程序。尝试为此类型实现隐式写入或格式。
我的解决方案是
implicit val tWrites = new Writes[T] {
def writes(t: T) = t match {
case a: A => Json.toJson(a)
case b: B => Json.toJson(b)
}
}
我不喜欢它,因为它需要为每个延伸T的新类更改tWrite。
是否有更灵活的实施?
答案 0 :(得分:0)
Json.writes
宏需要unapply
方法,因此您无法将其与特征一起使用。但即使你可以,它也只能序列化它从T知道的参数。所以你的解决方案是你能做到的最好的,尽管你可能(根据用例)必须添加一个参数,在反序列化时区分A和B.
顺便说一句,在添加新类型时必须扩展匹配是一个常见问题(请参阅表达式问题)。您应该设置特征sealed
,以便编辑器在模式匹配语句错过新添加的类型时通知您。