仅在喷雾 json 中具有案例对象自定义实现的特征

Posted

技术标签:

【中文标题】仅在喷雾 json 中具有案例对象自定义实现的特征【英文标题】:trait with only case objects custom implementation in spray json 【发布时间】:2016-12-12 10:30:04 【问题描述】:

鉴于我有以下声明:

sealed trait Color
case object DColor extends Color
case object CColor extends Color
case object VColor extends Color

然后我在这样的案例类中使用它们:

case class CustomColor(c: Color)
CustomColor(VColor)

现在我希望它生成一个像这样的 JSON:

c:"v_color"

【问题讨论】:

您的问题是关于如何将此案例类转换为 JSON 或如何在 Spray 中使用该序列化程序? 【参考方案1】:

应该定义一个自定义格式:

object MyJsonProtocol extends DefaultJsonProtocol 
    implicit object ColorJsonFormat extends RootJsonFormat[Color] 
               def write(c: Color) = c match 
                  case VColor => JsString("v_color")
                  case _ => JsString("foo")
               

               def read(value: JsValue) = ???
    

    implicit val customColorFormat = jsonFormat1(CustomColor.apply)

然后

alex-alex@ import MyJsonProtocol._
alex-alex@ CustomColor(VColor).toJson
res18: JsValue = "c":"v_color"

【讨论】:

以上是关于仅在喷雾 json 中具有案例对象自定义实现的特征的主要内容,如果未能解决你的问题,请参考以下文章

如何在喷雾中将所有拒绝转换为自定义 json?

喷雾客户端 - 将具有意外内容类型的响应视为应用程序/json?

使用密封的特征/案例类播放JSON:无限递归

Scala's Play 中具有多个案例类(总和类型)的特征的 Json 序列化

Scala Play Framework 2.6密封特征格式给Json

具有不同生命周期的对象的 Scala 蛋糕模式