Разбор двух типов JSON с одним классом случая? - PullRequest
0 голосов
/ 28 октября 2018

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

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

Или вот так:

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

Я хочу объединить их в один и тот же класс дел в 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]

}

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

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

1 Ответ

0 голосов
/ 01 ноября 2018

Может быть, я не понимаю ваш вопрос, но использование 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)))
...