我有以下用json4s编写的代码,它编译并工作得很好
import org.json4s._
def jsonRead[T <: AnyRef](input: String)(implicit m: Manifest[T]): T = {
Try(read[T](input)).get
}
def jsonWrite[T <: AnyRef](input: T)(implicit m: Manifest[T]): String = {
write[T](input).toString
}我编写了以下Circe代码
import io.circe._
import io.circe.syntax._
import io.circe.generic.auto._
import io.circe.parser.decode
def unmarshall[T <: AnyRef](input: String)(implicit m: Manifest[T]) : T ={
decode[T](input).right.get
}
def marshall[T <: AnyRef](input: T)(implicit m: Manifest[T]) : String = {
input.asJson.toString
}但我明白错误
Error:(27, 16) could not find implicit value for parameter decoder: io.circe.Decoder[T] decode[T](json).right.get
Error:(27, 16) not enough arguments for method decode: (implicit decoder: io.circe.Decoder[T])Either[io.circe.Error,T]. Unspecified value parameter decoder. decode[T](json).right.get
Error:(30, 11) could not find implicit value for parameter encoder: io.circe.Encoder[T] obj.asJson.toString
Error:(30, 11) not enough arguments for method asJson: (implicit encoder: io.circe.Encoder[T])io.circe.Json. Unspecified value parameter encoder. obj.asJson.toString发布于 2016-12-26 16:10:57
json4s和circe是不同的库,它们以不同的方式工作,这就是为什么不能使用相同的技术。json4s read需要一个Manifest从Json中提取一个值,而circe则需要一个类型类型Decoder的实例。如果您想在您的示例中使用circe,您应该编写以下内容
def unmarshall[T <: AnyRef](input: String)(implicit d: Decoder[T]) : T = {
decode[T](input).right.get
}
def marshall[T <: AnyRef](input: T)(implicit e: Encoder[T]) : String = {
input.asJson.toString
}为了理解我建议阅读这两种实现的不同之处,它们对于理解这两个库是如何做的非常有用。您可以在json4s本机read和circe decode的签名中看到差异。我将在这里复制签名的重要部分,以解释这两个图书馆之间的根本区别。json4s本机read的签名是
def read[A](input: String)(implicit mf: Manifest[A]): A它可以解释为“如果为字符串提供Scala,则可以将字符串转换为任意类型A”。因为Manifest是用于反射的Scala特性,所以可以推断read将使用反射。
circe decode的签名是不同的:
def decode[A](input: String)(implicit d: Decoder[A]): Either[Error, A]它可以读为“如果为字符串提供circe解码实例,我可以尝试将字符串转换为A类型”。Decoder类型集只是告诉系统如何从json中解码A类型的值。
https://stackoverflow.com/questions/41296319
复制相似问题