【问题标题】:Play 2.2.2 (Scala) Json parse as List[Class] issuePlay 2.2.2 (Scala) Json parse as List[Class] 问题
【发布时间】:2014-04-05 04:06:47
【问题描述】:

给定以下 Json 数组:

{
    "success": true,
    "data": [
        {
            "id": 594,
            "stage_id": 15,
            "title": "test deal",
            "value": 0,
            "currency": "EUR",
            "add_time": "2014-03-18 17:45:51",
            "update_time": "2014-03-24 13:30:27",
            "stage_change_time": "2014-03-24 13:30:27",
            "active": true,
            "deleted": false,
            "status": "open",
            "expected_close_date": null,
            "stage_order_nr": 1,
            "person_name": "test"
        },
        {
            "id": 601,
            "stage_id": 15,
            "title": "test deal2 deal",
            "value": 0,
            "currency": "EUR",
            "add_time": "2014-03-24 14:11:00",
            "update_time": "2014-03-24 14:11:00",
            "stage_change_time": "2014-03-24 14:11:00",
            "active": true,
            "deleted": false,
            "status": "open",
            "expected_close_date": null,
            "stage_order_nr": 1,
            "person_name": "test deal2"
        }
    ],
    "additional_data": {
        "pagination": {
            "start": 0,
            "limit": 100,
            "more_items_in_collection": false
        }
    }
}

我想从中获得一份交易清单,我正在尝试这样做

case class Deal(id: Long, stage_id: Long)

  def getAllDeals(): List [Deal] = {

    var holder : WSRequestHolder = WS.url(PipeDriveApiBaseUrl + "/deals")

    val complexHolder: WSRequestHolder = holder.withQueryString("filter_id" -> "9", "api_token" -> SalesManagerApiKey)
    val futureResponse: Future[Response] = complexHolder.get()

    implicit val dealReader = Json.reads[List[Deal]]

    val futureJson: Future[List[Deal]] = futureResponse.map(
      response => (response.json \ "data").validate[List[Deal]].get
    )

我得到与隐式读取值有关的异常No unapply function found。但是评论出来,我会得到No Json deserializer found for type List[models.Deal]. Try to implement an implicit Reads or Format for this type.

我无法用这些答案herehere 解决问题。 我错过或误解了什么?

【问题讨论】:

  • 您是否尝试为Deal 制作Json.reads 而不是List[Deal]?像这样:implicit val dealReader = Json.reads[Deal]
  • 另外,如果你打算使用.validate[List[Deal]].get,你也可以只使用.as[List[Deal]],因为你放弃了使用JsResult.get 调用的好处。
  • @Carsten 使用 Deal 而不是 List[Deal] 有效!非常感谢。我想,我以前试过这个……
  • @Ryan 我考虑了你的建议。谢谢!

标签: json scala playframework


【解决方案1】:

不要为List[Deal] 定义一个隐式Json.reads,而是为Deal 创建一个:

implicit val dealReader = Json.reads[Deal]

Play 已经为列表提供了一个内置的隐式 JSON 读取转换器。实际上,它为所有 Traversables 提供了一个。你可以look at the code,但是有点难读。问题是:Play 可以将 JSON 列表转换为 List 对象。它不知道如何读取/转换Deal,这就是为什么你需要上面提到的隐式定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多