如何为(de)序列化建模枚举类型的有限值集?

时间:2015-01-21 20:55:26

标签: json scala enums spray-json

我正在使用Spray-json 1.3.1。我有以下JSON消息:

{
   "results": [{
   ... NOT IMPORTANT PART HERE ...
   }],
   "status": "OK"
}

通常,可以通过

将其反序列化为status字符串字段
case class Message[T](results: List[T], status: String)

使用自定义协议

object MessageProtocol extends DefaultJsonProtocol {
  implicit def messageFormat[T: JsonFormat] = jsonFormat2(Message.apply[T])
}

由于status字段可以是OK之一,ZERO_RESULTSOVER_QUERY_LIMIT将此字段作为字符串无效。因为我来自 Java背景我在Scala中尝试了枚举实现如下:

case class Message[T](results: List[T], status: Status)
object Status extends Enumeration{
  type Status = Value
  val OK,ZERO_RESULTS,OVER_QUERY_LIMIT, REQUEST_DENIED, INVALID_REQUEST,UNKNOWN_ERROR = Value
} 

object MessageProtocol extends DefaultJsonProtocol {
  implicit val statusFormat = jsonFormat(Status)
  implicit def messageFormat[T: JsonFormat] = jsonFormat2(Message.apply[T])
}

解决此问题的最佳做法/方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以简单地实现自己的RootJsonFormat(作为Message伴随对象中的隐式)并覆盖读写函数。在那里你将拥有JsObject,你可以将它转换为你自己的case类,就像你想要将字符串转换为所需的枚举等一样。你可以看到样本here