首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将json解析为Case类

将json解析为Case类
EN

Stack Overflow用户
提问于 2014-01-31 11:13:34
回答 1查看 1.8K关注 0票数 0

我得到了以下JSON,我需要将2个值映射到一个case类--这些值是、job_id、状态

JSON如下所示

代码语言:javascript
复制
{
  "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"
}

案例类是

代码语言:javascript
复制
case class JobInfo(job_id: String)

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

这很好,但我想将截图' state‘添加到case类中,而不必使用整个Scrern快照,因为我只需要持久化job_id和状态,如下所示

代码语言:javascript
复制
case class JobInfo(job_id: String, state: String)

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

我正在像下面这样读取响应,但是屏幕截图是一个数组,所以我想知道如何从它中提取JSON键'state‘并将它映射到case类

代码语言:javascript
复制
    .map {
                response => {
    val jobInfo = Json.parse(response.body).as[JobInfo]    
     }
   }
EN

回答 1

Stack Overflow用户

发布于 2014-01-31 12:58:00

您需要定义一个自定义ReadsJobInfo对象来处理解析。假设您打算从屏幕截图数组中获取第一个元素来查找状态,您可以这样做:

代码语言:javascript
复制
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未按预期格式化的情况,即:

代码语言:javascript
复制
Json.parse(response).validate[JobInfo].fold(
  jobInfo => {
    //do something with your jobInfo
    println(jobInfo)  
  },
  errors => {
    //handle JSON parsing errors
    println(errors)
  }
)

这种方式可以更优雅地处理解析错误。Play文档更详细地描述了这一点,这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21478698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档