【发布时间】:2015-08-02 07:42:24
【问题描述】:
我有以下案例类和 JSON 组合器:
case class Commit(
sha: String,
username: String,
message: String
)
object Commit {
implicit val format = Json.format[Commit]
}
case class Build(
projectName: String,
parentNumber: String,
commits: List[Commit]
)
val buildReads: Reads[Build] =
for {
projectName <- (__ \ "buildType" \ "projectName").read[String]
name <- (__ \ "buildType" \ "name").read[String]
parentNumber <- ((__ \ "artifact-dependencies" \ "build")(0) \ "number").read[String]
changes <- (__ \ "changes" \ "change").read[List[Map[String, String]]]
} yield {
val commits = for {
change <- changes
sha <- change.get("version")
username <- change.get("username")
comment <- change.get("comment")
} yield Commit(sha, username, comment)
Build(s"$projectName::$name", parentNumber, commits)
}
Build 的 JSON 读取组合器将处理传入的 JSON,例如:
{
"buildType": {
"projectName": "foo",
"name": "bar"
},
"artifact-dependencies": {
"build": [{
"number": "1"
}]
},
"changes": {
"change": [{
"verison": "1",
"username": "bob",
"comment": "foo"
}]
}
}
但是,如果artifact-dependencies 丢失,它会倒下。我希望这是可选的。
我应该使用readNullable吗?我试过这样做,但失败了,因为它是一个嵌套属性。
这看起来很实用,还是我滥用 JSON 组合器将我的 JSON 解析为案例类?
【问题讨论】:
-
突然冒出来:你能用
.asOpt代替.read吗? -
这在
JsPath对象上不可用。 -
您能粘贴一些示例 json 吗?我的感觉是你让这变得不必要地复杂了。
-
嗨@LuxuryMode,我的原始帖子中已经有示例JSON?
-
@OliverJosephAsh doh。不知道我是怎么错过的。
标签: json scala playframework combinators