我具有以下JSON结构的预定义类MyClass
:
{
"key1": [
// Objects of MyClass
],
"key2": [
// Objects of MyClass
],
"key3": [
// Objects of MyClass
]
}
key1, key2, key3
是可选的(至少必须存在一个,但我不需要对其进行验证)根据Play框架文档,我需要执行以下操作:
implicit val myClassReads: Reads[] = (
(JsPath \ "key1").read[List[MyClass]] and
(JsPath \ "key2").read[List[MyClass]] and
(JsPath \ "key3").read[List[MyClass]]
)
但是这种方法有一些缺点:
key1, key2, key3
的数据类型始终为MyClass
)。重复read[MyClass]
似乎是多余的。
如果有key1, key2, ... key100
的JSON模式发生变化怎么办?代码变得非常混乱。
如何编写将read[MyClass]
应用于所有字段的自定义验证器?
这样的事情?
def convertJsonToListModel[T](json: JsValue)(implicit reads: Reads[T]): List[T] = {
val conversionResult: JsResult[List[T]] = json.validate[List[T]]
conversionResult match {
case s: JsSuccess[List[T]] => s.get
case e: JsError => e.get
}
}
Play JSON具有产品类型(例如案例类)的自动格式派生。您可以在文档中找到更多详细信息:https://www.playframework.com/documentation/latest/ScalaJsonAutomated我想在您的情况下,这会类似于以下内容:
import play.api.libs.json._
case class MyClass(value: String)
object MyClass {
implicit format = Json.format[Resident]
}
case class MyClassContainer(key1: List[MyClass], key2: List[MyClass], key3: List[MyClass])
object MyClassContainer {
implicit format = Json.format[MyClassContainer]
}
希望这会有所帮助。