我正在尝试实现一个Argonaut JSON解码器实例,该实例将JSON字符串转换为我的枚举QuestionType的实例。问题是,如果字符串无效,则返回的DecodeResult应该是错误,并且我不确定如何执行此操作。

我的代码当前如下所示:

implicit def QuestionTypeDecodeJson: DecodeJson[QuestionType] = {
    DecodeJson(c => for {
      typeName <- c.as[String]
      questionType = QuestionType.fromString(typeName).get
    } yield questionType)
  }
QuestionType.fromString(typeName)返回一个Option。理想情况下,我不想使用get,而是将Option转换为DecodeResult,其中包含Option的内容,或者如果错误状态为None,则为错误状态。

我可以使用DecodeResult的构造函数,但是老实说,它的签名让我很困惑(我对scala还是陌生的)。似乎它需要一个CursorHistory对象,并且我不确定应该在其中传递什么。

最佳答案

DecodeResult对象具有“确定”和“失败”方法。

implicit def QuestionTypeDecodeJson: DecodeJson[QuestionType] = {
    DecodeJson(c => for {
      typeName <- c.as[String]
      questionType = DecodeResult.ok(QuestionType.fromString(typeName))
    } yield questionType)
}

08-05 01:54