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

How to model finite set of values of enum-like type for (de)serialization?

我正在使用 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 字段可以是 OKZERO_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])
}

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

您可以简单地实现自己的 RootJsonFormat(作为 Message 伴随对象中的隐式)并覆盖读写函数。在那里,您将拥有 JsObject,您可以根据需要将其转换为您自己的案例 class,例如将字符串转换为所需的枚举等。您可以看到示例 here