使用scala argonaut对多个嵌套类进行复杂编码

时间:2016-03-02 12:51:23

标签: json scala encoding argonaut

以下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

1 个答案:

答案 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文档中也有一个有用的例子。