У меня есть сервер Java, создающий сообщение, похожее на это:
@SerializedName("message")
private String _message;
@SerializedName("args")
private Object[] _args;
Теперь в моем приложении Scala.js я хочу десериализовать это сообщение, используя что-то вроде:
case class Notification(message: String, args: String*)
implicit val messageDecoder: Decoder[Notification] = (c: HCursor) => {
for {
message <- c.downField("message").as[String]
args <- c.downField("args").as[List[java.lang.Object]].map(_.toString)
} yield {
Notification(level, message, args)
}
}
Однако Scala отказывается декодировать это с ошибкой:
implicit error;
[error] !I d: Decoder[List[Object]]
[error] Decoder.importedDecoder invalid because
[error] !I exported: Exported[Decoder[List[Object]]]
[error] Decoder.decodeCanBuildFrom invalid because
[error] !I d: Decoder[Object]
[error] ??Decoder.importedDecoder invalid because
[error] !I exported: Exported[Decoder[Object]]
[error]
[error] Decoder.decodeList invalid because
[error] !I evidence$2: Decoder[Object]
[error] ??Decoder.importedDecoder invalid because
[error] !I exported: Exported[Decoder[Object]]
[error] args <-
c.downField("args").as[List[Object]].map(_.toString)
[error] ^
[error] one error found
Есть идеи, как это декодировать?Мне нужно только позвонить map(toString)
на результат.
Изменить
При попытке сделать что-то вроде этого:
args <- c.downField("args").as[Array[Any]].map(_.toString)
Я получаю следующую ошибку:
diverging implicit expansion for type io.circe.Decoder[A]
[error] starting with value decodeString in object Decoder
[error] args <-
c.downField("args").as[Array[Any]].map(_.toString)
[error] ^
[error] one error found
Редактировать 2
args <- c.downField("args").as[Seq[String]].map(_.toString)
Компилируется, но не разбирается успешноjson (слева).
Редактировать 3
Один из примеров json, который отправляется (в данном случае с целыми числами):
{
"message" : "{0} is smaller than {1}.",
"args" : [
1,
2
]
}
Java-сервер также может генерировать JSON, похожий на этот:
{
"message" : "{0} is smaller than {1}. ({2})",
"args" : [
1,
2,
"Hello World!"
]
}