我得到了以下JSON,我需要将2个值映射到一个case类--这些值是、job_id、和状态
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]
}这很好,但我想将截图' state‘添加到case类中,而不必使用整个Scrern快照,因为我只需要持久化job_id和状态,如下所示
case class JobInfo(job_id: String, state: String)
object JobInfo {
implicit val fmt = Json.format[JobInfo]
}我正在像下面这样读取响应,但是屏幕截图是一个数组,所以我想知道如何从它中提取JSON键'state‘并将它映射到case类
.map {
response => {
val jobInfo = Json.parse(response.body).as[JobInfo]
}
}发布于 2014-01-31 12:58:00
您需要定义一个自定义ReadsJobInfo对象来处理解析。假设您打算从屏幕截图数组中获取第一个元素来查找状态,您可以这样做:
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的原始调用现在可以工作了;但是,您应该使用验证方法来正确处理JSON未按预期格式化的情况,即:
Json.parse(response).validate[JobInfo].fold(
jobInfo => {
//do something with your jobInfo
println(jobInfo)
},
errors => {
//handle JSON parsing errors
println(errors)
}
)这种方式可以更优雅地处理解析错误。Play文档更详细地描述了这一点,这里。
https://stackoverflow.com/questions/21478698
复制相似问题