【发布时间】: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