以下terminal.PNG
方法有什么问题?
一直在使用Scala http://lollyrock.com/articles/scala-implicit-conversion/
进行隐式JSON转换的示例此问题类似于:Encoding nested classes using scala argonaut
区别在于嵌套的附加层。
我从编译器收到以下错误:
MainClassEncodeJson
提前感谢。
包含编码器和解码器的完整性
Cannot resolve reference EncodeJson with such signature
答案 0 :(得分:2)
将6.1版与Scalaz 7.1.x一起使用我使用CodecJson\[_\]
和casecodecN
函数进行了以下编译。
import scalaz._, Scalaz._
import argonaut._, Argonaut._
object ImplicitConversion {
case class MainClass( txid: String
, hat: Hat
, version: Int
, bot: Bot
, time: Int
, locktime: Int)
case class Hat( value: Float
, n: Int
, nxt: Nxt)
case class Nxt( typetx: String
, reqsigs: Int
, addresses: List[Address])
case class Bot( base: String
, sequence: Int)
case class Address(address: String)
implicit val botCodec: CodecJson[Bot] =
casecodec2(Bot.apply, Bot.unapply)("base", "sequence")
implicit val addressCodec: CodecJson[Address] =
casecodec1(Address.apply, Address.unapply)("address")
implicit val nxtCodec: CodecJson[Nxt] =
casecodec3(Nxt.apply, Nxt.unapply)("typetx", "reqsigs", "addresses")
implicit val hatCodec: CodecJson[Hat] =
casecodec3(Hat.apply, Hat.unapply)("value", "n", "nxt")
implicit val mainClassCodec: CodecJson[MainClass] =
casecodec6(MainClass.apply, MainClass.unapply)("txid", "hat", "version", "bot", "time", "locktime")
}
我的build.sbt
看起来像这样:
name := "stackoverflow"
scalaVersion := "2.11.7"
val scalazVersion = "7.1.0"
val argonautVersion = "6.1"
libraryDependencies ++= Seq(
"org.scalaz" %% "scalaz-core" % scalazVersion,
"io.argonaut" %% "argonaut" % argonautVersion,
)
通过使用这种定义编码/解码的方式 - 当使用简单的案例类来体现JSON对象文字时 - 我认为由于提高了可读性和减少了移动部分,我们最终会得到更简单的代码来维护(这些都是声明性的而不是遵循for-comprehension逻辑)。我还发现它是一个更可组合的问题定义,因此我可以从小开始,而不必担心内部案例类的内容。
您需要按照 need 的顺序放置CodecJson[_]
隐含(即在使用它们的外部内容之前定义内部案例类编解码器)或者您将获得编译时警告
Argonaut网站上的QuickStart文档中也有一个有用的例子。