2017-10-13 12 views
0

シナリオ: 私はケースクラス次ている:私は書く必要が次のコードで間違いが見つかりませんでしたか?

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

読み取りと学生のために書き込みます。私が提供するjsonはSequence of Studentです。例については :

{ 
    "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) 

私はここに来る問題は、文が代わりのelseifで実行された場合でも、学生のリスト最初のケース、すなわちを提供する、です。どのようにすべての条件を満たすように検証することができますか。つまり、ステートメントが実行され、Student Listが提供されている場合、Studentオブジェクトが提供されます。elseifステートメントが実行されます。

答えて

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. 
    ) 
} 
関連する問題