簡體   English   中英

Scala:使用 playframework 將部分 Json 映射到對象

[英]Scala: Map part of Json to Object with playframework

我對 Scala 比較陌生。 我想將我的 Json 的一部分映射到我的對象。 代碼如下所示:

    def seasons = (json \\ "season")

案例類:

  case class Season(startDate: LocalDate, endDate: LocalDate)

json結構:

[
      {
        "id": "",
        "name": "",
        "season": {
          "start": "0",
          "end": "0"
        }
      }
]

我想以某種方式結束一個 List[Season],這樣我就可以遍歷它。

問題2

json-structure:

[
      {
        "id": "",
        "name": "",
        "season": {
          "start": "0",
          "end": "0"
        }
      },
      {
        "id": "",
        "name": "",
        "season": {
          "start": "0",
          "end": "0"
        }
      }...
]

Json(順便說一句,這是一個 JsValue)帶來了多個區域,如上所示。 提供案例分類(Region 持有一個 Season),命名與 json 中相同。 格式如下所示:

implicit val seasonFormat: Format[Season] = Json.format[Season]
implicit val regionFormat: Format[Region] = Json.format[Region]

那么我需要調用什么才能獲得 List[Region]? 我在定義格式時想到了regionsJson.as[List[Region]]類的東西,它為我提供了讀/寫的可能性。 但不幸的是,它不起作用。

這樣做的最佳方法是什么? 我已經用 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 的評論。

如果無法在 case 類中映射 json,則as方法將產生異常,非異常選項是使用asOpt ,它不會引發異常,但如果無法映射,則返回None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM