2016-01-06 70 views
0

我想为JSON验证编写一个scala应用程序。我有一个Animals.scala类定义以下内容:使用斯卡拉JSON验证

case class Animals (id: Int, type: String, targets: String) 

object Animals { 

    implicit val reads: Reads[Animals] = (
      (JsPath \ "id").read[Int] and 
      (JsPath \ "type").read[String] and 
      (JsPath \ "targets").read[String])(Animals.apply _) 

} 

我有Application.scala,我试图验证传入的JSON对案例类。

object Application extends Controller { 

    // action for JSON validation 
    def validateRequest = Action { implicit request => 
    // this will fail if the request body is not a valid json value 
    val bodyAsJson = request.body.asJson.get 

    bodyAsJson.validate[Animals] match { 
     case success: JsSuccess[Animals] => { 
     val id = success.get.id 
     Ok("Validation passed! id is "+ id) 
     } 
     case JsError(error) => BadRequest("Validation failed!") 
    } 
    } 

} 

最后这里是我的JSON输入:

{ 
"id" : 1, 
"type" : "domestic", 
"targets": { 
    "AND": [ 
     { 
     "breed": ["greyhound", "dalmatian"] 
     }, 
     { 
     "NOT": { 
      "color": ["amber", "pale_amber", "black"] 
      } 
     }, 
     { 
     "zipcode": ["90210", "90211"] 
     } 
    ] 
} 
} 

而且我得到以下错误: JsError(List((/targets,List(ValidationError(error.expected.jsarray,WrappedArray())))))

我认识到错误被抛出,因为targets字段不是那样简单一个String相比,我的JSON。我如何包装它以便验证通过?我应该做List[List[String]]还是按照这些方法?

回答

1

如果您不关心目标的结构,请将其作为JsObject读取。它将以这种方式解析任何内部结构。

+0

谢谢!通过了验证。如果我也要验证“目标”的内容,或者采取什么样的正确方法,这会有多难? – summerNight

+0

为它们实现类和读取,以便它们坚持你的json结构 –