我正试图绕着Circe.
所以,这是我给出的模型:
object Gender extends Enumeration {
type Gender = Value
val Male, Female, Unisex, Unknown = Value
}
case class Product(id: String, gender: Gender.Value)
Run Code Online (Sandbox Code Playgroud)
我想要
a)将这个简单的例子编码为JSON字符串
val product = Product(id = "1234", gender = Gender.Female)
Run Code Online (Sandbox Code Playgroud)
b)将生成的JSON映射回Product case类.
我自己的尝试并没有让我走得太远:
object JsonProtocol {
implicit val productDecoder: Decoder[Product] = deriveDecoder
implicit val productEncoder: Encoder[Product] = deriveEncoder
}
Run Code Online (Sandbox Code Playgroud)
导致编译时错误
Error:(52, 49) could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[A]
implicit val productDecoder: Decoder[Product] = deriveDecoder
^
Run Code Online (Sandbox Code Playgroud)
我不知道为什么抛出这个异常以及解决方案看起来像什么.也许这是Enumeration类型的用法?但是,我只是在猜测.
pme*_*pme 15
已接受的答案已被弃用(大约 0.12.0)。
Circe 现在提供以下功能:
Decoder.decodeEnumeration[E <: Enumeration](enum: E)
Encoder.encodeEnumeration[E <: Enumeration](enum: E)
Run Code Online (Sandbox Code Playgroud)
举个例子:
implicit val genderDecoder: Decoder[Gender.Value] = Decoder.decodeEnumeration(Gender)
implicit val genderEncoder: Encoder[Gender.Value] = Encoder.encodeEnumeration(Gender)
Run Code Online (Sandbox Code Playgroud)
尝试使用以下内容为枚举定义自己的编码器和解码器:
Decoder.enumDecoder[E <: Enumeration](enum: E)
Encoder.enumEncoder[E <: Enumeration](enum: E)
Run Code Online (Sandbox Code Playgroud)
就像是:
object JsonProtocol {
implicit val genderDecoder: Decoder[Gender.Value] = Decoder.enumDecoder(Gender)
implicit val genderEncoder: Encoder[Gender.Value] = Encoder.enumEncoder(Gender)
implicit val productDecoder: Decoder[Product] = deriveDecoder
implicit val productEncoder: Encoder[Product] = deriveEncoder
}
Run Code Online (Sandbox Code Playgroud)
这些都是必需的,因为自动/半自动派生仅适用于sealed trait
s的层次结构,case classes
据我所知.您看到该错误的原因是因为派生的编解码器Product
将隐式地要求编码器/解码器用于每个参数的类型.编码器/解码器String
是Circe的标准部分,但您可能需要为自己的枚举创建一个.
看看enumeratum如果你想使用枚举与瑟茜.然后你可以尝试这样的事情:
import enumeratum._
sealed trait Gender extends EnumEntry
case object Gender extends CirceEnum[Gender] with Enum[Gender] {
case object Male extends Gender
case object Female extends Gender
case object Unisex extends Gender
case object Unknown extends Gender
val values = findValues
}
Gender.values.foreach { gender =>
assert(gender.asJson == Json.fromString(gender.entryName))
}
Run Code Online (Sandbox Code Playgroud)
这应该与circe的自动派生一起使用,以便与您的案例类一起使用.
归档时间: |
|
查看次数: |
3311 次 |
最近记录: |