喷 JSON 格式和转换错误
Spray JSON Format and Conversion Error
我有一个特征,我想为其编写 Typeclasses。这个 trait 实际上是一个将 JSON 转换为 Case class 的契约,反之亦然。 trait的定义如下:
trait Converter[T] {
def convertFromJson(msg: String): Either[ConverterError, T]
def convertToJson(msg: T): String
}
现在,对于我遇到的 class 个案例,我定义了这样的实现:
object Converter extends DefaultJsonProtocol {
implicit object DefaultMessageConversions extends Converter[DefaultMessage] {
implicit val json = jsonFormat(DefaultMessage, "timestamp")
def convertFromJson(msg: String): Either[ConverterError, DefaultMessage] = {
try {
Right(msg.parseJson.convertTo[DefaultMessage])
}
catch {
case _: Exception => Left(ConverterError("Shit happens"))
}
}
def convertToJson(msg: DefaultMessage) = {
implicit val writes = Json.writes[DefaultMessage]
Json.toJson(msg).toString
}
}
def apply[T: Converter] : Converter[T] = implicitly
}
但是我 运行 在尝试构建我的项目时遇到了一些编译器错误。我不确定我做错了什么?
[error] /Users/joesan/ingestion/src/main/scala/com/my/project/common/JsonMessageConversion.scala:28: could not find implicit value for evidence parameter of type com.my.project.common.JsonMessageConversion.Converter.JF[org.joda.time.DateTime]
[error] implicit val json = jsonFormat(DefaultMessage, "timestamp")
这是我的案例 class 的样子:
case class DefaultMessage(timestamp: DateTime) extends KafkaMessage {
def this() = this(DateTime.now(DateTimeZone.UTC))
}
您的 DefaultMessage
使用 org.joda.time.DateTime
和 spray-json 不知道如何 serialize/deserialize 开箱即用。
因此您需要定义一个 RootJsonFormat[DateTime]
并将其引入隐式范围。
Here 是一个示例实现。
我有一个特征,我想为其编写 Typeclasses。这个 trait 实际上是一个将 JSON 转换为 Case class 的契约,反之亦然。 trait的定义如下:
trait Converter[T] {
def convertFromJson(msg: String): Either[ConverterError, T]
def convertToJson(msg: T): String
}
现在,对于我遇到的 class 个案例,我定义了这样的实现:
object Converter extends DefaultJsonProtocol {
implicit object DefaultMessageConversions extends Converter[DefaultMessage] {
implicit val json = jsonFormat(DefaultMessage, "timestamp")
def convertFromJson(msg: String): Either[ConverterError, DefaultMessage] = {
try {
Right(msg.parseJson.convertTo[DefaultMessage])
}
catch {
case _: Exception => Left(ConverterError("Shit happens"))
}
}
def convertToJson(msg: DefaultMessage) = {
implicit val writes = Json.writes[DefaultMessage]
Json.toJson(msg).toString
}
}
def apply[T: Converter] : Converter[T] = implicitly
}
但是我 运行 在尝试构建我的项目时遇到了一些编译器错误。我不确定我做错了什么?
[error] /Users/joesan/ingestion/src/main/scala/com/my/project/common/JsonMessageConversion.scala:28: could not find implicit value for evidence parameter of type com.my.project.common.JsonMessageConversion.Converter.JF[org.joda.time.DateTime]
[error] implicit val json = jsonFormat(DefaultMessage, "timestamp")
这是我的案例 class 的样子:
case class DefaultMessage(timestamp: DateTime) extends KafkaMessage {
def this() = this(DateTime.now(DateTimeZone.UTC))
}
您的 DefaultMessage
使用 org.joda.time.DateTime
和 spray-json 不知道如何 serialize/deserialize 开箱即用。
因此您需要定义一个 RootJsonFormat[DateTime]
并将其引入隐式范围。
Here 是一个示例实现。