在Play Framework中在运行时构建Reads转换器和案例类

时间:2018-11-18 23:39:34

标签: scala playframework playframework-2.6 play-json

我有一个文件,其中包含以下JSON对象数组:

getX()

在Play Framework 2.x中,我将定义一个隐式的Reads转换器以读取文件并将其转换为Scala结构:

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

Scala案例类定义为:

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

并使用以下命令解析JSON:

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

现在,我的问题是我只知道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 } 而不是runtime的JSON文件的结构。可以在compilation time上建立隐式Reads转换器和case类吗?

1 个答案:

答案 0 :(得分:0)

直接将case classesplay-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
}

这就是您所需要的。如果您对参数名称不满意,可以使用Wrapper案例类。