Построение конвертера Reads и класса case во время выполнения в Play Framework - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть файл, который содержит следующий массив объектов JSON:

[
    {
      "type": "home",
      "number": 1111
    },
    {
      "type": "office",
      "number": 2222
    },
    {
      "type": "mobile",
      "number": 3333
    }
  ]

В Play Framework 2.x я бы определил неявный преобразователь Reads для чтения файла и преобразования его в структуру Scala:

implicit val implicitRead : Reads[MyClass] = (
      (JsPath \ "type").read[String] and
      (JsPath \ "number").read[Int]
)  (MyClass.apply _)

класс дел Scala, определенный как:

case class MyClass (myType: String, myNumber: Int)

и анализ JSON с помощью:

val json = // file record content    
json.validate[MyClass] match {
  case s: JsSuccess[MyClass] => {
    val myObject: MyClass = s.get
    // do something with myObject
  }
  case e: JsError => {
    // error handling flow
  }

Теперь моя проблема в том, что я знаю структуруфайла JSON только в runtime, а не в compilation time.Можно ли построить как неявный конвертер Reads, так и класс case в runtime?

1 Ответ

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

Используйте case classes напрямую с play-json:

Измените case class на:

case class MyClass (`type`: String, number: Int)

Добавьте json-formatter к объекту-компаньону:

object MyClass {
  implicit val format = Json.format[MyClass]
}

Функция validate выглядит следующим образом:

val myClass = // file record content    
json.validate[Seq[MyClass]] match {
  case JsSuccess(myClasses, _) => myClasses
  case e: JsError =>  // handle error case
}

Это все, что вам нужно.Если вас не устраивают имена параметров, вы можете использовать класс case Wrapper.

...