Разбор двух типов json с одним классом case?

У меня есть класс case в scala, которому необходимо проанализировать объект json. Однако объект json может выглядеть по-разному. Нравится:

 "hint": {
            "structure": [
               "HIDE"
            ]
         }

Или вот так:

"hint": {
          "type": "1",
          "template": "A"
        }

Я хочу разобрать их обоих в один и тот же класс case в Scala с помощью circe. Я делаю что-то вроде этого:

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]

}

Но похоже, что должен быть более изящный способ сделать это, чтобы я мог просто вернуть, скажем, список строк в случае первого экземпляра и только тип и шаблон во втором экземпляре. Но я не могу понять, как это сделать с помощью Цирцеи.

Благодарен за помощь!


person Nespony    schedule 28.10.2018    source источник


Ответы (1)


Возможно, я не понимаю ваш вопрос, но использование 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)))
person Damien O'Reilly    schedule 01.11.2018