0

我正在使用 Argonaut 通过我的自定义编解码器解析 JSON。我的代码如下所示:

val json: String = ...
val parsed = Parse.decodeEither[MyClass](json)
val checks = if (parsed.isRight) parsed.right.get
else sys.error("Unable to parse MyClass json: " + parsed.left)

但是,我从未收到任何有用的错误消息。我得到的只是java.lang.RuntimeException: Unable to parse MyClass json: LeftProjection(Left(String: CursorHistory(List())))

处理解码错误的正确方法是什么?

编辑:我的问题不是如何处理提供的错误消息。如果 Argonaut 可以说“位置 X 解析错误,意外成员 y”或类似的话,那就太好了。那可能吗?

4

2 回答 2

0

我同意 Argonaut 解码错误可能有点简洁,但它们也很有意义。注意CursorHistory对象。它提供解码期间的最新操作。

在您的情况下,您似乎无法解析 JSON,因为CursorHistory它是一个空的List.

简单示例(未测试):

case class Person(name: String, age: Int)

object Person {
  implicit def PersonCodecJson: CodecJson[Person] =
    casecodec2(Person.apply, Person.unapply)("name", "age")
}

人 JSON:

{
  "name": "Fred"
}

解析上述示例的错误类似于:CursorHistory(List(El(CursorOpDownField(age),false))).

于 2018-11-17T02:38:30.177 回答
0

我不太确定我是否理解你的实际问题......

你得到,Java.lang.RuntimeException: Unable to parse MyClass json: LeftProjection(Left(String: CursorHistory(List())))因为那是什么sys.error

当您使用该方法Parse.decodeEither时,结果类型为Either[String, MyClass]. 有很多方法可以检查或使用 Either。其中之一,您已经在使用:检查结果是否在任一侧并根据它采取行动。

不过,更惯用的方法是折叠它:

parsed.fold(
    error => //do something with error,
    myclass => //do something with myclass
)

从 Scala 2.12 开始,Either是右偏 Monad,这意味着您可以在 for 理解中使用它,它将 flatMap 覆盖在右手边。我认为阅读它的文档可能会有所帮助。

于 2018-11-16T16:58:48.690 回答