2

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

由于statusfield 可以是 , 之一,OK因此将此字段作为 String 是没有意义的。由于我来自 Java 背景,因此我尝试了 Scala 中的枚举实现如下:ZERO_RESULTSOVER_QUERY_LIMIT

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

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

4

1 回答 1

1

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

于 2015-01-23T18:45:59.773 回答