用一个case类解析两种json?

时间:2018-10-28 19:23:39

标签: scala circe

我在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做到这一点。

感谢您的帮助!

1 个答案:

答案 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)))