在没有JSPath的Play框架中验证JSON

问题描述 投票:0回答:2

我具有以下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]]
)

但是这种方法有一些缺点:

  1. key1, key2, key3的数据类型始终为MyClass)。重复read[MyClass]似乎是多余的。

  2. 如果有key1, key2, ... key100的JSON模式发生变化怎么办?代码变得非常混乱。

如何编写将read[MyClass]应用于所有字段的自定义验证器?

json scala playframework
2个回答
1
投票

这样的事情?

 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
      }
 }

0
投票

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]
}

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.