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