从 JsObject 解析 Scala List[Int]
parse Scala List[Int] from JsObject
我需要从 JsObject
中解析列表 [Int]
值。我通过以下代码从 JsObject
获得了正常的 String
和 Int
值。
我得到的
def receive = {
case json_req: JsObject => {
val studentName = (json_req \ "student_name").as[String]
val studentNo = (json_req \ "student_no").as[Int]
println("studentName"+student_name)
println("studentNo"+student_no)
}
}
以上代码打印学生姓名和学生编号。
我需要的
JSONObject
{"student_records":[
{"student_id":9,"class_id":9},
{"student_id":10,"class_id":10},
{"student_id":11,"class_id":11}
]}
从上面 JsonObject
我需要得到两个列表值可能是 student ids List 和 class ids List
StudentList = List[9,10,11]
ClassList = List[9,10,11]
我试过的
def receive = {
case json_req: JsObject => {
try {
val StudentList = (json_req \ "student_records" \ "student_id").map(_.as[Int]).toList
val ClassList = (json_req \ "student_records" \ "class_id").map(_.as[Int]).toList
println("StudentList = "+StudentList)
println("ClassList = "+ClassList)
} catch {
case e: Exception => println(e)
}
}
}
我试过的代码给出了这个 Exception
play.api.libs.json.JsResultException: JsResultException(errors:List((,List(Valid
ationError(error.expected.jsnumber,WrappedArray())))))
如果您使用与问题中相同的 "JSONObject" 字符串,那么您的代码将按预期工作(尽管您不应该使用 Title Case,除非它是常量)。
您看到的错误是因为您期望的数字值之一实际上不是 JsNumber
。也许它是未定义的,也许它是一个字符串,也许是一个空值,甚至可能是一个数组。如果它是一个字符串那么它可能仍然是一个 Int,你只需要正确地解析它。要使您的代码更灵活并更好地指示出了什么问题,您可以做的是手动处理 JsValue
。如果您查看下面的 jsValueToInt
方法,您可以了解如何获取 ht JsValue
并将其手动转换为 Int。
// notice that the class_id: "10" is actually a String in this version
val json_req = Json.parse(
"""
|{"student_records":[
|{"student_id":9,"class_id":9},
|{"student_id":10,"class_id":"10"},
|{"student_id":11,"class_id":11}
|]}
""".stripMargin)
def jsValueToInt(jsval: JsValue): Int = jsval match {
case JsNumber(x) => x.toInt
case JsString(s) => s.toInt // may throw a NumberFormatException
case anythingElse => throw new IllegalArgumentException(s"JsValue cannot be parsed to an Int: $anythingElse")
}
val studentList = (json_req \ "student_records" \ "student_id").map(jsValueToInt).toList
val classList = (json_req \ "student_records" \ "class_id").map(jsValueToInt).toList
我需要从 JsObject
中解析列表 [Int]
值。我通过以下代码从 JsObject
获得了正常的 String
和 Int
值。
我得到的
def receive = {
case json_req: JsObject => {
val studentName = (json_req \ "student_name").as[String]
val studentNo = (json_req \ "student_no").as[Int]
println("studentName"+student_name)
println("studentNo"+student_no)
}
}
以上代码打印学生姓名和学生编号。
我需要的
JSONObject
{"student_records":[
{"student_id":9,"class_id":9},
{"student_id":10,"class_id":10},
{"student_id":11,"class_id":11}
]}
从上面 JsonObject
我需要得到两个列表值可能是 student ids List 和 class ids List
StudentList = List[9,10,11]
ClassList = List[9,10,11]
我试过的
def receive = {
case json_req: JsObject => {
try {
val StudentList = (json_req \ "student_records" \ "student_id").map(_.as[Int]).toList
val ClassList = (json_req \ "student_records" \ "class_id").map(_.as[Int]).toList
println("StudentList = "+StudentList)
println("ClassList = "+ClassList)
} catch {
case e: Exception => println(e)
}
}
}
我试过的代码给出了这个 Exception
play.api.libs.json.JsResultException: JsResultException(errors:List((,List(Valid
ationError(error.expected.jsnumber,WrappedArray())))))
如果您使用与问题中相同的 "JSONObject" 字符串,那么您的代码将按预期工作(尽管您不应该使用 Title Case,除非它是常量)。
您看到的错误是因为您期望的数字值之一实际上不是 JsNumber
。也许它是未定义的,也许它是一个字符串,也许是一个空值,甚至可能是一个数组。如果它是一个字符串那么它可能仍然是一个 Int,你只需要正确地解析它。要使您的代码更灵活并更好地指示出了什么问题,您可以做的是手动处理 JsValue
。如果您查看下面的 jsValueToInt
方法,您可以了解如何获取 ht JsValue
并将其手动转换为 Int。
// notice that the class_id: "10" is actually a String in this version
val json_req = Json.parse(
"""
|{"student_records":[
|{"student_id":9,"class_id":9},
|{"student_id":10,"class_id":"10"},
|{"student_id":11,"class_id":11}
|]}
""".stripMargin)
def jsValueToInt(jsval: JsValue): Int = jsval match {
case JsNumber(x) => x.toInt
case JsString(s) => s.toInt // may throw a NumberFormatException
case anythingElse => throw new IllegalArgumentException(s"JsValue cannot be parsed to an Int: $anythingElse")
}
val studentList = (json_req \ "student_records" \ "student_id").map(jsValueToInt).toList
val classList = (json_req \ "student_records" \ "class_id").map(jsValueToInt).toList