2016-01-13 34 views
0

我试图建立JSON结构验证器的一员,在这一点上我已经有了的东西如下:值不是序列化

读取定义

case class SubTaskConfigElement(name: String) 

case class MultiSelectConfig(subTasks: Seq[SubTaskConfigElement]) 

implicit val subTaskConfigElementReads: Reads[SubTaskConfigElement] = 
    (__ \ "name").read[String](minLength[String](0)).map(SubTaskConfigElement) 

implicit val multiSelectConfigReads: Reads[MultiSelectConfig] = (
    (__ \ "subTasks").read[Seq[SubTaskConfigElement]] 
).map(MultiSelectConfig) 

而且我有一个单元测试如下:

val configJson = Json.parse(
       """ 
        |{ 
        | "subTasks": [ 
        |  { "name": "Sub Task 1" }, 
        |   { "name": "Sub Task 2" }, 
        |  { "name": "Sub Task 3" } 
        | ] 
        |} 
       """.stripMargin) 

      val valid = configJson.validate[MultiSelectConfig] getOrElse JsError 

      logger.info(valid + "") 

      valid must beAnInstanceOf[MultiSelectConfig] 
      valid.subTasks must beAnInstanceOf[List[SubTaskConfigElement]] 

在测试中,我得到一个错误的最后一行,当我执行测试:

[error] /app/process-street/test/validation/widget/config/FormFieldWidgetSpec.scala:29: value subTasks is not a member of Serializable 
[error]    valid.subTasks must beAnInstanceOf[Seq[SubTaskConfigElement]] 

的IntelliJ也将其识别为一个问题:“无法解析符号子任务”

为什么会发生?我错过了什么?

谢谢。

回答

1

的问题是这一行:

val valid = configJson.validate[MultiSelectConfig] getOrElse JsError 

类型的valid被推断为Serializable,因为这是的MultiSelectConfigJsError共同父类型。两者都是案例类和案例类自动从`Serializable继承。

+0

谢谢你的解释,我已经明白哪一行是问题,只是不知道为什么会发生。 –

+0

@ShurikAgulyansky当你使用'getOrElse b'时,结果类型将是'a'和'b'共有的最近父类型。如果它们是相同的类型,那么所有的都是好的,但在你的情况下,在'val valid'语句中,它们是不一样的,所以类型是'Serializable'。 'Serializable'的实例没有名为'subTasks'的成员,这就是为什么你会得到这个错误。作为'getOrElse'的替代方法,'validate'返回一个'JsResult',你可以按照[这里](https://www.playframework.com/documentation/2.3.x/ScalaJson)的描述匹配模式匹配。 – wwkudu