2017-10-13 3 views
0

Scénario: je suit la classe de cas:Je ne pouvais pas trouver ce qui est erreur dans le code suivant?

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

Je dois écrire lecture et d'écriture pour les étudiants. Le json que je fournis est une séquence d'étudiant. Par exemple:

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

j'ai écrit mon lit et écrit que:

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) 

Maintenant, je dois faire un analyseur de type et vérifier si l'étudiant est un tableau ou un objet simple. Ici, la clé, c'est-à-dire l'étudiant, peut être Etudiants ou StudentInfo. Je dois donc faire un analyseur sur la base de la valeur fournie en json.

Pour cela je l'ai fait comme suit:

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) 

Le problème que je reçois ici est, même fourni la liste des étudiants le premier cas, à savoir si l'instruction est exécutée au lieu de elseif. Comment puis-je valider pour satisfaire toutes les conditions, c'est-à-dire si l'objet Student est fourni si la déclaration est exécutée et si la liste de l'étudiant est fournie sinon l'instruction est exécutée.

Répondre

0

Vous disposez d'un moyen bien meilleur, plus sûr et plus fonctionnel de valider un fichier json.

Supposons que vous avez une classe College cas:

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

Vous pouvez avoir un lecteur comme celui-ci:

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

Ensuite, afin de le valider, vous pouvez le faire:

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