2014-01-31 91 views
0

我有以下的JSON,我需要2個值映射到一個案例類 這些值JOB_ID狀態解析JSON以案例類

的JSON如下

{ 
    "screenshots": [ 
    { 
     "browser": "chrome", 
     "state": "pending", 
     "url": "http://localhost/mirror/52ea1b22e4b0e133507b209b", 
     "browser_version": "26.0", 
     "os_version": "7", 
     "id": "92342eed1fd14c354d9365cbbd3e35ea1fc45df2", 
     "os": "Windows" 
    } 
    ], 
    "wait_time": 5, 
    "callback_url": "http://localhost/screenshot/accept/52ea1b22e4b0e133507b209b", 
    "quality": "compressed", 
    "job_id": "ce991c0c3d140b5a78859b28cf391fd99c63ff98", 
    "win_res": "1024x768", 
    "orientation": "portrait", 
    "mac_res": "1024x768" 
} 

隨着案情類是

case class JobInfo(job_id: String) 

object JobInfo { 
    implicit val fmt = Json.format[JobInfo] 
} 

這工作得很好,但我想牛逼o增加了屏幕截圖「國家」爲案例類,而不必把整個scrernshot,因爲我只堅持JOB_ID和狀態,因此像下面

case class JobInfo(job_id: String, state: String) 

object JobInfo { 
    implicit val fmt = Json.format[JobInfo] 
} 

我讀這樣的,但下面的截圖是響應數組所以想知道我怎麼會從中提取JSON關鍵「國家」,並將其映射到案例類

.map { 
       response => { 
    val jobInfo = Json.parse(response.body).as[JobInfo]  
    } 
    } 

回答

0

你需要定義一個自定義顯示[JOBINFO]對象來處理解析。假設你打算抓住從截圖數組的第一個元素來找到狀態,你可以如下做到這一點:

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 

object JobInfo { 
    implicit val jobReads: Reads[JobInfo] = (
    (__ \ "job_id").read[String] and 
    ((__ \ "screenshots")(0) \ "state").read[String] 
)(JobInfo.apply _) 
} 

原來的通話解析JSON將現在的工作;但是,你應該使用validate方法妥善處理:其中,按照預期的JSON未格式化的情況下,即

Json.parse(response).validate[JobInfo].fold(
    jobInfo => { 
    //do something with your jobInfo 
    println(jobInfo) 
    }, 
    errors => { 
    //handle JSON parsing errors 
    println(errors) 
    } 
) 

這樣你更加妥善地處理了解析錯誤。 Play文檔更詳細地描述了這一點here