我在scala中有一个case类,需要解析一个json对象。但是,json对象可以采用两种不同的方式。像这样:
"hint": {
"structure": [
"HIDE"
]
}
或者这样:
"hint": {
"type": "1",
"template": "A"
}
我想使用circe将它们解析为Scala中的同一个case类。我试图做这样的事情:
case class Hint(`type`:Option[String] = None,template:Option[String], structure: Option[List[String]])
object Hint {
implicit val hintJsonDecoder: Decoder[Hint] = deriveDecoder[Hint]
implicit val hintJsonEncoder: ObjectEncoder[Hint] = deriveEncoder[rHint]
}
但是似乎应该有一种更整洁的方式来做到这一点,以便在第一个实例的情况下我可以只返回一个字符串列表,而在第二个实例的情况下可以仅返回类型和模板。但是我不知道如何使用Circe做到这一点。
感谢您的帮助!
答案 0 :(得分:0)
也许我不明白您的问题,但是使用Option可以给您带来您所不想要的。如果您想要一个不太冗长的解决方案,则可以使用如下所示的自动推导:
import io.circe.generic.auto._
import io.circe.parser.decode
case class HintContainer(hint: Hint)
case class Hint(`type`: Option[String], template: Option[String], structure: Option[List[String]])
object Sample extends App {
val testData1 =
"""
|{
| "hint": {
| "structure": [
| "HIDE"
| ]
| }
|}
|""".stripMargin
val testData2 =
"""
|{
| "hint": {
| "type": "1",
| "template": "A"
| }
|}
|""".stripMargin
println(decode[HintContainer](testData1))
println(decode[HintContainer](testData2))
}
哪个给:
Right(HintContainer(Hint(None,None,Some(List(HIDE)))))
Right(HintContainer(Hint(Some(1),Some(A),None)))