Как преобразовать значение json "aaa,bbb" в "Seq[String]" с помощью argonaut?

Я использую аргонавт, чтобы разобрать JSON в тематических классах.

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 ответ

Аргументы 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 сделан для удобного использования с конструкторами и экстракторами класса case, но он гораздо более гибкий, чем просто.

Другие вопросы по тегам