在 Play Framework 运行时构建读取转换器和案例 class
Building Reads converter and case class at runtime in Play Framework
我有一个包含以下 JSON 个对象数组的文件:
[
{
"type": "home",
"number": 1111
},
{
"type": "office",
"number": 2222
},
{
"type": "mobile",
"number": 3333
}
]
在 Play Framework 2.x 中,我将定义一个隐式读取转换器来读取文件并将其转换为 Scala 结构:
implicit val implicitRead : Reads[MyClass] = (
(JsPath \ "type").read[String] and
(JsPath \ "number").read[Int]
) (MyClass.apply _)
Scala 案例 class 定义为:
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
。是否可以在 runtime
处构建隐式读取转换器和案例 class?
直接使用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
}
这就是您所需要的。如果您对参数名称不满意,可以使用 Wrapper case class.
我有一个包含以下 JSON 个对象数组的文件:
[
{
"type": "home",
"number": 1111
},
{
"type": "office",
"number": 2222
},
{
"type": "mobile",
"number": 3333
}
]
在 Play Framework 2.x 中,我将定义一个隐式读取转换器来读取文件并将其转换为 Scala 结构:
implicit val implicitRead : Reads[MyClass] = (
(JsPath \ "type").read[String] and
(JsPath \ "number").read[Int]
) (MyClass.apply _)
Scala 案例 class 定义为:
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
。是否可以在 runtime
处构建隐式读取转换器和案例 class?
直接使用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
}
这就是您所需要的。如果您对参数名称不满意,可以使用 Wrapper case class.