![](/img/trans.png)
[英]How to parse json list or array in scala for play framework 2.2
[英]How to parse this JSON using Play Framework?
我從Web服務返回了以下JSON:
{
"hits": [
{
"created_at": "2016-02-01T15:01:03.000Z",
"title": "title",
"num_comments": 778,
"parent_id": null,
"_tags": [
"story",
"author",
"story_11012044"
],
"objectID": "11012044",
"_highlightResult": {
"title": {
"value": "title",
"matchLevel": "full",
"matchedWords": [
"title"
]
},
"author": {
"value": "author",
"matchLevel": "none",
"matchedWords": [
]
},
"story_text": {
"value": "Please lead",
"matchLevel": "none",
"matchedWords": [
]
}
}
}
]
}
我正在嘗試使用Play Framework中的JSON解析庫來解析它。 我有以下代碼:
import play.api.libs.functional.syntax._
import play.api.libs.json._
case class Post(id: Long, date: String, count: Int)
object Post {
implicit val postFormat = Json.format[Post]
implicit val writes: Writes[Post] = (
(JsPath \ "id").write[Long] and
(JsPath \"date").write[String] and
(JsPath \ "count").write[Int]
)(unlift(Post.unapply))
implicit val reads: Reads[Post] = (
(JsPath \ "objectID").read[Long] and
(JsPath \ "created_at").read[String] and
(JsPath \ "num_comments").read[Int]
)(Post.apply _)
}
import play.api.libs.json._
class PostRepo {
val request: WSRequest = ws.url(MY_URL)
def getPosts: Future[Seq[Post]] =
val result: Future[JsValue] = request.get().map(response =>
response.status match {
case 200 => Json.parse(response.body)
case _ => throw new Exception("Web service call failed: " + response.body)
})
result.map( {
jsonvalue => println("JSARRAY: " + jsonvalue);
(jsonvalue \ "hits").as[Seq[Post]]
})
result
}
現在,當我運行代碼時,出現以下錯誤:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[JsResultException:
JsResultException(錯誤:列表((((0)/日期,列表(ValidationError(列表(error.path.missing),WrappedArray())))))(((0)/計數,列表(ValidationError(列表(error.path。缺少),WrappedArray()))),((0)/ id,List(ValidationError(List(error.path.missing),WrappedArray())))),((1)/ date,List(ValidationError(List( error.path.missing),WrappedArray()))))(((1)/ count,List(ValidationError(List(error.path.missing),WrappedArray())))),(((1)/ id,List( ValidationError(List(error.path.missing),WrappedArray()))))(((2)/ date,List(ValidationError(List(error.path.missing),WrappedArray()))),(((2)/ count,List(ValidationError(List(error.path.missing),WrappedArray())))),((2)/ id,List(ValidationError(List(error.path.missing),WrappedArray()))),( (3)/ date,List(ValidationError(List(error.path.missing),WrappedArray()))),((3)/ count,List(ValidationError(List(error.path.missing),WrappedArray()) )),((3 / id,List(ValidationError(List(error.path.missing),WrappedArray()))))
顯然,我嘗試解析JSON的方式出了點問題,但是我現在已經花了幾個小時試圖找出問題所在,而且我感到非常滿意。
使用Reads.seq
一些重構代碼
val r = (__ \ "hits").read[Seq[Post]](Reads.seq[Post])
def getPosts: Future[Seq[Post]] = {
WS.url(MY_URL).get().map(response =>
response.status match {
case 200 => r.reads(response.json) match {
case JsError(e) => throw new Exception("Json read fails. Response body:" + response.json.toString() + "\nRead error:" + e.toString())
case JsSuccess(x, _) => x
}
case _ => throw new Exception("Web service call failed: " + response.body)
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.