1

我正在使用 argonaut 将 json 解析为案例类。

杰森:

{
    "name" : "Mike",
    "email" : "a@aaa.com, b@bbb.com"
}

斯卡拉:

case class User(agentName: String, emails: Seq[String])

object User {
  implicit def DecodeJson: DecodeJson[User] =
    casecodec2(User.apply, User.unapply)("name", "email")
}

代码无法编译,错误是:

Error:(17, 65) could not find implicit value for evidence parameter of type        
    argonaut.EncodeJson[Seq[String]]
    casecodec2(User.apply, User.unapply)("name", "email")

如何修复它,以便我可以解析a@aaa.com, b@bbb.comSeq("a@aaa.com", "b@bbb.com")?

4

1 回答 1

1

的参数casecodec2是函数,所以如果你需要在解析的 JSON 上执行这样的操作,你可以在那里执行:

case class User(agentName: String, emails: Seq[String])

object User {
  implicit val CodecJson: CodecJson[User] = casecodec2[String, String, User](
    (n, e) => User(n, e.split(", ")),
    u => Some((u.agentName, u.emails.mkString(", ")))
  )("name", "email")
}

或者,如果你真的只需要解码器:

object User {
  implicit def DecodeJson: DecodeJson[User] =
    jdecode2L((n: String, e: String) => User(n, e.split(", ")))("name", "email")
}

casecodecN是为了方便与案例类构造函数和提取器一起使用而设计的,但它比这更灵活。

于 2014-09-19T14:34:53.460 回答