【问题标题】:Argonaut decoder how to change the type of one value in a case classArgonaut解码器如何更改案例类中一个值的类型
【发布时间】:2017-06-02 01:21:58
【问题描述】:

我喜欢为我的案例类使用casecodecN 或无形解码器,但是当它是 json 时,其中一个字段具有不同的类型。

考虑一下,其中 json 中的 b 是一个类似 "1.23" 的字符串,但我希望它是一个 Double。

case class Foo(a: Double, b: Double)

如果我使用 casecodec2 会出错,因为 b 是一个字符串

casecodec2(Foo.apply, Foo.unapply)("a", "b")

所以我必须手动写DecodeJson

DecodeJson[Foo](
  c =>
    for {
      a <- (c --\ "a").as[Double]
      b <- (c --\ "b").as[String].map(_.toDouble)
    } yield Foo(a, b)
)

这对于短案例类来说是可以的,但对于大类来说就很乏味了。

有没有一种方法我可以使用派生的解码器但只更改一个值类型?

谢谢

【问题讨论】:

    标签: scala argonaut


    【解决方案1】:

    你可以在你的类中使用隐式转换:

    case class Foo(a: Double, b: Double){
       implicit def string2Double(s: String): Double = augmentString(s).toDouble
    }
    

    【讨论】:

    • 谢谢,这是一个不错的选择。但是,如果我这样做,则不清楚哪个字段可以有字符串双打。如果a 以这种方式格式化,我仍然希望它是解码失败。
    猜你喜欢
    • 2018-06-18
    • 2017-01-11
    • 2019-03-15
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2022-10-25
    相关资源
    最近更新 更多