假设:
import argonaut._, Argonaut._
case class Person(name: String)
implicit def decode: DecodeJson[Person] =
DecodeJson ( c =>
for {
name <- (c --\ "name").as[String]
} yield Person(name)
)
scala> Parse.decode[Person]("""{"name": "Bob", "foo": "dunno"}""")
res5: Either[Either[String,(String, argonaut.CursorHistory)],Person] =
Right(Person(Bob))
我如何使用光标的历史decode
,即JSON => Person
?根据历史,我的意思是,我想知道"foo" : "dunno"
没有被查看/遍历过。
答案 0 :(得分:1)
不幸的是,为成功案例构建DecodeResult[T]
对象时,将丢弃游标历史记录。
我能想到的唯一解决方案(它只是一个解释你概念的存根)是:
HistoryDecodeResult
:class HistoryDecodeResult[A](
val h: Option[CursorHistory],
result: \/[(String, CursorHistory),A]
) extends DecodeResult[A](result)
object HistoryDecodeResult{
def apply[A](h: Option[CursorHistory], d: DecodeResult[A]) = new HistoryDecodeResult(h, d.result)
}
ACursor
添加助手asH
方法implicit class AHCursor(a: ACursor){
def asH[A](implicit d: DecodeJson[A]): HistoryDecodeResult[A] = {
HistoryDecodeResult(a.hcursor.map(_.history), a.as[A](d))
}
}
DecodeResult[T]
中覆盖HistoryDecodeResult
composition methods以累积历史记录:override def map[B](f: A => B): HistoryDecodeResult[B] =
HistoryDecodeResult(h, super.map(f))
//Accumulate history `h` using `CursorHistory.++` if flat-mapping with another HistoryDecodeResult
override def flatMap[B](f: A => DecodeResult[B]): HistoryDecodeResult[B] = ???
... //Go on with other methods
HistoryDecodeResult
(您必须避免Parse.decode
)并询问历史记录。答案 1 :(得分:0)
根据argonaut cursor documentation,您可以使用hcursor而不是解码器,这样就可以跟踪解码过程。