Scala:使用 playframework 将 Json 的一部分映射到对象
Scala: Map part of Json to Object with playframework
我对 Scala 比较陌生。我想将 Json 的一部分映射到我的对象。代码如下所示:
def seasons = (json \ "season")
案例class:
case class Season(startDate: LocalDate, endDate: LocalDate)
json-结构:
[
{
"id": "",
"name": "",
"season": {
"start": "0",
"end": "0"
}
}
]
我想以某种方式结束列表[Season],这样我就可以遍历它。
问题 #2
json-structure:
[
{
"id": "",
"name": "",
"season": {
"start": "0",
"end": "0"
}
},
{
"id": "",
"name": "",
"season": {
"start": "0",
"end": "0"
}
}...
]
Json(顺便说一句,这是一个 JsValue)带来了多个区域,如上所示。提供了案例 classed(Region holds a Season),命名与 json 中的相同。
格式如下所示:
implicit val seasonFormat: Format[Season] = Json.format[Season]
implicit val regionFormat: Format[Region] = Json.format[Region]
那么我需要调用什么才能获得 List[Region]?我在定义格式时想到了 regionsJson.as[List[Region]]
之类的东西,它为我提供了 Read/Write 的可能性。但不幸的是,它不起作用。
最好的方法是什么?我用 JsArray 试过了,但我很难映射它...
如有任何意见,我们将不胜感激!
我对您的原始 case class
添加了一些更改并重命名了它的字段以匹配 json 字段。
以下代码将 json 解析为 Seq[Session]
import java.time.LocalDate
import play.api.libs.json._
case class Season(start: LocalDate, end: LocalDate)
implicit val sessionFormat: Format[Season] = Json.format[Season]
val json =
"""
|[
| {
| "id": "",
| "name": "",
| "season": {
| "start": "2020-10-20",
| "end": "2020-10-22"
| }
| }
|]
|""".stripMargin
val seasonsJson: collection.Seq[JsValue] = Json.parse(json) \ "season"
val seasons: collection.Seq[Season] = seasonsJson.map(_.as[Season])
seasons.foreach(println)
请注意,我更改了您的 json 的数据,而不是 0
,这不是有效日期,我提供了 iso 格式的日期 yyyy-mm-dd
.
以上代码适用于 play-json 版本 2.9.0。
---更新---
跟进@cchantep 的评论。
如果 json 无法映射到 class,方法 as
将产生异常,non-exception 选项是使用 asOpt
抛出异常,但 returns 如果无法映射则抛出 None
。
我对 Scala 比较陌生。我想将 Json 的一部分映射到我的对象。代码如下所示:
def seasons = (json \ "season")
案例class:
case class Season(startDate: LocalDate, endDate: LocalDate)
json-结构:
[
{
"id": "",
"name": "",
"season": {
"start": "0",
"end": "0"
}
}
]
我想以某种方式结束列表[Season],这样我就可以遍历它。
问题 #2
json-structure:
[
{
"id": "",
"name": "",
"season": {
"start": "0",
"end": "0"
}
},
{
"id": "",
"name": "",
"season": {
"start": "0",
"end": "0"
}
}...
]
Json(顺便说一句,这是一个 JsValue)带来了多个区域,如上所示。提供了案例 classed(Region holds a Season),命名与 json 中的相同。 格式如下所示:
implicit val seasonFormat: Format[Season] = Json.format[Season]
implicit val regionFormat: Format[Region] = Json.format[Region]
那么我需要调用什么才能获得 List[Region]?我在定义格式时想到了 regionsJson.as[List[Region]]
之类的东西,它为我提供了 Read/Write 的可能性。但不幸的是,它不起作用。
最好的方法是什么?我用 JsArray 试过了,但我很难映射它...
如有任何意见,我们将不胜感激!
我对您的原始 case class
添加了一些更改并重命名了它的字段以匹配 json 字段。
以下代码将 json 解析为 Seq[Session]
import java.time.LocalDate
import play.api.libs.json._
case class Season(start: LocalDate, end: LocalDate)
implicit val sessionFormat: Format[Season] = Json.format[Season]
val json =
"""
|[
| {
| "id": "",
| "name": "",
| "season": {
| "start": "2020-10-20",
| "end": "2020-10-22"
| }
| }
|]
|""".stripMargin
val seasonsJson: collection.Seq[JsValue] = Json.parse(json) \ "season"
val seasons: collection.Seq[Season] = seasonsJson.map(_.as[Season])
seasons.foreach(println)
请注意,我更改了您的 json 的数据,而不是 0
,这不是有效日期,我提供了 iso 格式的日期 yyyy-mm-dd
.
以上代码适用于 play-json 版本 2.9.0。
---更新---
跟进@cchantep 的评论。
如果 json 无法映射到 class,方法 as
将产生异常,non-exception 选项是使用 asOpt
抛出异常,但 returns 如果无法映射则抛出 None
。