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

19 浏览
0 Comments

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

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

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

显然,这可以通过

case class Message[T](results: List[T], status: String)

自定义协议反序列化为status字符串字段

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

由于status字段可以是OKZERO_RESULTSOVER_QUERY_LIMIT中的一种,因此将此字段作为字符串是没有意义的。由于我来自Java背景,因此我尝试使用以下实现:

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])
}

解决这个问题的最佳实践/方法是什么?

admin 更改状态以发布 2023年5月21日
0
0 Comments

您可以简单地实现自己的RootJsonFormat(作为Message伴生对象中的隐式),并覆盖read和write函数。在那里,您将拥有JsObject,可以将其转换为自己想要的case类,例如将字符串转换为所需的枚举等。您可以在此处看到一个示例。

0