如何用argonaut将json值“aaa,bbb”转换为“Seq [String]”?

时间:2014-09-19 02:45:31

标签: json scala argonaut

我使用argonaut将json解析为case类。

JSON:

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

Scala的:

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.com解析为Seq("a@aaa.com", "b@bbb.com")

1 个答案:

答案 0 :(得分:0)

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是为了方便使用案例类构造函数和提取器而创建的,但它比这更灵活。