Circe: Json объект для пользовательского объекта - PullRequest
0 голосов
/ 30 января 2020

У меня go этот json узел

...
"businessKeys": [
    "product://color?product_code",
    "product://?code"
  ]
...

после последовательности вычислений у меня есть Json istance , но я не могу понять, как Я могу превратить этот объект в список моего объекта. Поэтому Json (istance) для List [MyClass].

MyClass(root: ParameterType, children: List[ParameterType] = List.empty)
ParameterType(parameter: String)

У меня есть метод, который преобразует String в istance MyClass, поэтому мне нужно декодировать Json в List [String], а затем вызвать мою функцию или есть прямой метод? Спасибо

1 Ответ

1 голос
/ 31 января 2020

Вам необходимо реализовать наш собственный io.circe.Decoder, в вашем случае его можно преобразовать из декодера в строку.

Пожалуйста, найдите пример кода ниже:

import io.circe._
import io.circe.generic.auto._

object CirceExample {
  class ParameterType(parameter: String) {
    override def toString: String = parameter
  }

  class MyClass(root: ParameterType, children: List[ParameterType] = List.empty) {
    override def toString: String = s"MyClass($root, $children)"
  }

  object MyClass {
    /**
     * Parsing logic from string goes here, for sake of example, it just returns empty result
     */
    def parse(product: String): Either[String, MyClass] = {
      Right(new MyClass(new ParameterType("example")))
    }

    // This is what need - just declare own decoder, so the rest of circe infrastructure can use it to parse json to your own class.
    implicit val decoder: Decoder[MyClass] = Decoder[String].emap(parse)
  }

  case class BusinessKeys(businessKeys: List[MyClass])

  def main(args: Array[String]): Unit = {
    val json = "{ \"businessKeys\": [\n    \"product://color?product_code\",\n    \"product://?code\"\n  ] }"
    println(parser.parse(json).map(_.as[BusinessKeys]))
  }
}

Который в моем дело выдает следующий вывод:

Right(Right(BusinessKeys(List(MyClass(example, List()), MyClass(example, List())))))

Надеюсь, это вам поможет!

...