Использование обобщенных Scala для анализа методов + json4s - PullRequest
0 голосов
/ 26 марта 2019

Я не уверен, достижимо ли это, и у меня есть базовое понимание того, как дженерики работают в scala. Но мне было интересно, если это возможно. Скажем, у меня есть метод:

case class Person(id:String,name:String)
case class Student(id:String,name:String, class:String)

    def convertToJson[A](fileName:String):{
     //read file
     parse[A]
    }

Можно ли написать этот универсальный метод, который будет анализировать json на основе типа класса, который я отправляю при вызове метода convertToJson? Что-то вроде:

convertToJson[Student](fileName)
convertToJson[Person](fileName)

Кстати, приведенный выше код дает мне:

Нет доступного манифеста для A. error.

Использование json4s для разбора. Любая помощь приветствуется.

1 Ответ

3 голосов
/ 26 марта 2019

Это преобразует строку JSON в case class

import org.json4s._
import org.json4s.jackson.JsonMethods._

def convertToJson[T](json: String)(implicit fmt: Formats = DefaultFormats, mf: Manifest[T]): T =
  Extraction.extract(parse(json))

После того, как это будет определено, вы можете проанализировать соответствующие строки для требуемого типа:

case class Person(id: String, name: String)
case class Student(id: String, name: String, `class`: String)

val person = convertToJson[Person]("""{"name":"Jane","id":45}""")
val student = convertToJson[Student]("""{"name":"John","id":63, "class": "101"}""")

Обратите внимание, что это будетигнорировать данные JSON, которые не соответствуют полям в case class.Если поле является необязательным в JSON, задайте его как Option в case class, и вы получите None, если поля там нет.

...