如何使用嵌套泛型类型为对象定义JSON格式?

时间:2017-04-02 16:39:13

标签: scala generics akka-http spray-json

我有一个具有此定义的案例类:

case class EndpointResponse[A](timestamp: Instant, uuid: UUID, content: A)

case class User(id: UUID, username: String, email: String)

具有以下定义的JsonFormat:

trait EndpointsJsonProtocol extends DefaultJsonProtocol {

  implicit def endpointResponseJsonFormat[A: JsonFormat] = new RootJsonFormat[EndpointResponse[A]] {
    val dtFormatter = DateTimeFormatter.ISO_INSTANT

    override def write(response: EndpointResponse[A]): JsValue = response match {
      case _: EndpointResponse[_] => JsObject(
        "timestamp" -> JsString(dtFormatter.format(response.timestamp)),
        "uuid" -> JsString(response.uuid.toString), // note we don't encode to slug on purpose
        "content" -> response.content.toJson
      )
      case x => deserializationError("Deserialization not supported " + x)
    }

    override def read(value: JsValue): EndpointResponse[A] = value match {
      case JsObject(encoded) =>
        value.asJsObject.getFields("timestamp", "uuid", "content") match {
          case Seq(JsString(timestamp), JsString(uuid), content) =>
            EndpointResponse(Instant.from(dtFormatter.parse(timestamp)), UUID.fromString(uuid), content.convertTo[A])
          case x => deserializationError("Unable to deserialize from " + x)
        }
      case x => deserializationError("Unable to deserialize from " + x)
    }
  }

  implicit def userResponseFormat: JsonFormat[User] = jsonFormat3(User.apply)
}

/ ** JsonProtocol的单身人士* / object EndpointsJsonProtocol扩展了EndpointsJsonProtocol

现在,当我尝试使用简单类型作为内容转换为json时,它可以正常工作。

EndpointResponse(uuid, user).toJson

但是当我尝试使用嵌套泛型时,它不会编译。

val records: List[User] = // not relevant
EndpointResponse(uuid, records).toJson

知道我在这里做错了吗?提前致谢。我已经导入了spray.json._和我的自定义协议,所以这不是问题。

编辑:我没有导入协议,而是一个名称相似的类。欢迎编程! :)至少有人可以从中受益。

1 个答案:

答案 0 :(得分:1)

愚蠢的我,我输入了错误的类型。一旦我导入了正确的类型,这是有效的。希望代码可以帮助别人。