将具有共同特征的案例类序列化为JSON

时间:2014-06-26 19:40:29

标签: json scala playframework-2.0 case-class

我们说我有

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。

是否有更灵活的实施?

1 个答案:

答案 0 :(得分:0)

Json.writes宏需要unapply方法,因此您无法将其与特征一起使用。但即使你可以,它也只能序列化它从T知道的参数。所以你的解决方案是你能做到的最好的,尽管你可能(根据用例)必须添加一个参数,在反序列化时区分A和B.

顺便说一句,在添加新类型时必须扩展匹配是一个常见问题(请参阅表达式问题)。您应该设置特征sealed,以便编辑器在模式匹配语句错过新添加的类型时通知您。