gpt4 book ai didi

json 具有默认值的通用解码器使用带有 circe 的 scala

转载 作者:行者123 更新时间:2023-12-05 06:20:41 27 4
gpt4 key购买 nike

我遇到了一个奇怪的情况。
我正在尝试构建一个采用类型和 JSON 的方法并将其构建到案例类实例中,并在需要时自动完成缺失的键值。
到目前为止,我设法分别完成了所有事情,但还没有完成。
具有默认值的案例类:

case class Foo(a: String = "empty String", b: Option[Int] = Some(1))

当我进行转换时:

import io.circe.generic.extras.auto._
import io.circe.generic.extras.Configuration
import io.circe.parser.decode
implicit val customConfig: Configuration = Configuration.default.withDefaults

println(decode[Foo]("{}"))

这是我得到的输出:

Right(Foo(empty String,Some(1)))

一切如我所愿

但是当我把它放到一个通用方法中时,由于错误,它需要一个选项:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: DecodingFailure(Attempt to decode value on failed cursor, List(DownField(a)))

所以我将案例类更改为

case class Foo(a: Option[String] = Some("empty String"), b: Option[Int] = Some(1))

并添加解码器:

object Foo{
implicit val decoder:Decoder[Foo] = deriveDecoder[Foo]
}

方法:

import io.circe.Decoder
import io.circe.parser.decode

def convertToObj[T](jsonStr: String)(implicit decoder: Decoder[T]): T = {
decode[T](jsonStr)
match {
case Right(value) => value
case Left(error) => throw error
}
}
println(convertToObj[Foo]("{}"))

输出是:

Foo(None,None)

所以现在我丢失了我输入的默认值,也无法使用自动解码器。

如何将我的两个愿望结合到一个方法中?

最佳答案

您需要执行以下操作:

package foo.bar

import io.circe.Decoder
import io.circe.generic.extras.semiauto
import io.circe.generic.extras.Configuration
import io.circe.parser.decode

case class Foo(a: String = "empty String", b: Option[Int] = Some(1))

object Foo {
implicit val customConfig: Configuration = Configuration.default.withDefaults
implicit val decoder: Decoder[Foo] = semiauto.deriveConfiguredDecoder[Foo]
}

object TestApp extends App {
def convertToObj[T](jsonStr: String)(implicit decoder: Decoder[T]): T =
decode[T](jsonStr) match {
case Right(value) => value
case Left(error) => throw error
}

println(convertToObj[Foo]("{}"))
}

但是,您可以让 circe 自动为您派生解码器,这样您就可以使用更少的样板代码:

package foo.bar

import io.circe.Decoder
import io.circe.generic.extras.auto._
import io.circe.generic.extras.Configuration
import io.circe.parser.decode

case class Foo(a: String = "empty String", b: Option[Int] = Some(1))

object TestApp extends App {

implicit val customConfig: Configuration = Configuration.default.withDefaults

def convertToObj[T](jsonStr: String)(implicit decoder: Decoder[T]): T =
decode[T](jsonStr) match {
case Right(value) => value
case Left(error) => throw error
}

println(convertToObj[Foo]("{}"))
}

这两个例子都给我输出:Foo(empty String,Some(1))

注意:

method deriveDecoder in object semiauto is deprecated (since 0.12.0): Use deriveConfiguredDecoder

关于json 具有默认值的通用解码器使用带有 circe 的 scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60325950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com