我在下面的代码中找不到什么错误?

时间:2017-10-13 07:56:46

标签: json scala playframework-2.3

方案: 我有以下案例类:

case class Student(firstName:String, lastName: String)

我需要为Student写读写。我提供的json是学生序列。 例如:

{
  "College": "Abc",
  "student" : [{"firstName" : "Jack", "lastName":"Starc"}, 
               {"firstName" : "Nicolas", "lastName":"Pooran"}
             ]
}

我把我的读写写成:

implicit val studentFormat = Json.format[Student]
implicit val studentRead = Json.reads[Student]
implicit val  studentWrite = Json.writes[Student]
implicit val studentReadSeq = Reads.seq(studentRead)
implicit val studentWriteSeq = Writes.seq(studentWrite)

现在我必须创建一个类型解析器并检查学生是数组还是简单对象。这里的关键,即学生可以是学生或学生信息。所以我必须根据json中提供的值创建一个解析器。

为此,我做了如下:

def studentCheck(jsonValue:  JsObject) = {
  var modifiedJson = Json.obj()
  for ((key, value) <- jsonValue.value) {
    if(value.validate[Student].isSuccess ) {
      val json = 
        studentFormat.writes(value.validate[Student].get).as[JsObject] 
      modifiedJson.+(key, json)
    }
    else if(studentReadSeq.reads(value).isSuccess) {
      //My Code will be here
      modifiedJson
    }
    else {
      println("Error")
      modifiedJson.+(key,value)
    }
  }
}

val studentJson = Json.obj(
  "college" -> "ABC",
  "student" -> Json.arr(
    Json.obj("firstName" -> "Jack", "lastName" -> "Starc"),
    Json.obj("firstName" -> "Nicolas", "entity" -> "Pooran")
  )
)

studentCheck(studentJson)

我遇到的问题是,即使提供了学生名单第一种情况,即if语句是执行而不是elseif。如何验证它是否满足所有条件,即如果在执行语句时提供了Student对象,并且如果提供了List of Student,则执行elseif语句。

1 个答案:

答案 0 :(得分:0)

您有一种更好,更安全,更实用的方法来验证json。

假设你有一个College案例类:

case class College(college: String, students: List[Student])

你可以有一个这样的读者:

object College{
   implicit val collegeReads = Reads[College] = (
     (JsPath \ "college").read[String] and
     (JsPath \ "students").read[List[Student]
   ) (College.apply _)
}

然后为了验证它,你可以这样做:

def foo(jsonValue:  JsObject)={
   jsonValue.validate[College].fold(
      errors =>  ,//handle parsing errors
      collage => //your code when the parsing is successfull.
   )
}