簡體   English   中英

使用Argonaut和自定義編解碼器解析JSON時如何獲得更好的錯誤消息

[英]How to get better error messages when parsing JSON with Argonaut and custom codecs

我正在使用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”之類的話,那將是很棒的 那可能嗎?

我不確定我是否理解您的實際問題是...

您正在獲取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,這意味着您可以在理解中使用它,它將FlatMap放在右側。 我認為閱讀其文檔可能會有所幫助。

我同意Argonaut解碼錯誤可能會有點簡潔,但它們也很有意義。 注意CursorHistory對象。 它提供了解碼期間的最新操作。

在您的情況下,由於CursorHistory是一個空的List ,因此您似乎無法解析JSON。

簡單示例(未經測試):

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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM