2017-10-13 87 views
0

場景: 我有以下的情況下類:我無法找到以下代碼中的錯誤?

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

我需要編寫讀取和寫入學生。我提供的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甚至還提供學生名單第一種情況,即。我如何驗證它是否滿足所有條件,即,如果執行語句並且如果提供學生列表elseif語句,則提供Student對象。

回答

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. 
    ) 
} 
相關問題