首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Json4S迁移到Circe

将Json4S迁移到Circe
EN

Stack Overflow用户
提问于 2016-12-23 06:33:10
回答 1查看 1.8K关注 0票数 3

我有以下用json4s编写的代码,它编译并工作得很好

代码语言:javascript
复制
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代码

代码语言:javascript
复制
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
}

但我明白错误

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-26 16:10:57

json4scirce是不同的库,它们以不同的方式工作,这就是为什么不能使用相同的技术。json4s read需要一个Manifest从Json中提取一个值,而circe则需要一个类型类型Decoder的实例。如果您想在您的示例中使用circe,您应该编写以下内容

代码语言:javascript
复制
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的签名是

代码语言:javascript
复制
def read[A](input: String)(implicit mf: Manifest[A]): A

它可以解释为“如果为字符串提供Scala,则可以将字符串转换为任意类型A”。因为Manifest是用于反射的Scala特性,所以可以推断read将使用反射。

circe decode的签名是不同的:

代码语言:javascript
复制
def decode[A](input: String)(implicit d: Decoder[A]): Either[Error, A]

它可以读为“如果为字符串提供circe解码实例,我可以尝试将字符串转换为A类型”。Decoder类型集只是告诉系统如何从json中解码A类型的值。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41296319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档