【问题标题】:How to model finite set of values of enum-like type for (de)serialization?如何为(反)序列化建模类枚举类型的有限值集?
【发布时间】:2015-03-20 12:41:02
【问题描述】:

我正在使用 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])
}

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

【问题讨论】:

  • 我会看一下 Akka-Http,因为这就是 Spray 的样子。他们使用单例对象和继承解决了这个问题 --> doc.akka.io/api/akka-stream-and-http-experimental/1.0-M2/…
  • 还要考虑 case 对象,如 Daniel Sobral 在线程 stackoverflow.com/questions/1321745/… 中的响应所示,因为您的方法会产生不可靠的序列化/反序列化问题(诸如 `` "status" : {"name" 之类的东西: "OK"} '' 可能会出现在这里和那里破坏一切,具体取决于您的解析器/序列化程序库

标签: json scala enums spray-json


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多