代码之家  ›  专栏  ›  技术社区  ›  Leonardo Herrera

如何在使用Argonaut和自定义编解码器解析JSON时获得更好的错误消息

  •  0
  • Leonardo Herrera  · 技术社区  · 7 年前

    我正在使用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”之类的话。可能吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   hasumedic    7 年前

    我不太确定我是否理解你真正的问题是什么。。。

    你越来越 Java.lang.RuntimeException: Unable to parse MyClass json: LeftProjection(Left(String: CursorHistory(List()))) 因为这就是 sys.error

    当你使用这种方法时 Parse.decodeEither ,生成的类型是 Either[String, MyClass] .有很多方法可以检查或操作。其中一个,你已经在使用:检查结果是否在任何一边,并根据它采取行动。

    不过,更惯用的方法是将其折叠起来:

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

    从Scala 2.12开始, Either 是右偏的单子,这意味着你可以用它来理解一个平面图在右手边。 我觉得读它 docs

        2
  •  0
  •   Ken    7 年前

    我同意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")
    }
    

    人员:

    {
      "name": "Fred"
    }
    

    解析上述示例时出现的错误如下: CursorHistory(List(El(CursorOpDownField(age),false))) .

    推荐文章