2015-10-15 2 views
0

Мне нужно разобрать список [Int] значений от JsObject. Я получил нормальные String и Int значениями от JsObject по нижнему коду.parse Scala List [Int] from JsObject

Что я получаю

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 мне нужно, чтобы получить два списка значений, скорее студент Идентификаторы Перечислите и класс IdS Перечислите

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()))))) 

ответ

2

Если вы используете ту же строку «JSONObject», который вы использовали в вашем вопросе, то ваш код будет работать, как вы ожидаете (хотя вы не должны используйте заголовок, если он не является константой).

Ошибка, которую вы видите, потому что одно из значений, которое вы ожидаете от числа, на самом деле не является 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 
+0

Спасибо, друг, как вы сказали, мой опубликованный код работает нормально. Я нашел проблему на своей стороне. Я использовал другой метод, а не необходимый метод, поэтому он генерирует «исключение». – Jamal

Смежные вопросы