方案: 我有以下案例类:
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语句。
答案 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.
)
}