如何为(反)序列化模拟枚举类型的有限值集?
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
字段可以是 OK
、ZERO_RESULTS
、OVER_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
我正在使用 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_RESULTS
、OVER_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