【问题标题】:issue with circe serialization from json response in akka http来自akka http中json响应的circe序列化问题
【发布时间】:2021-06-21 23:59:44
【问题描述】:

可能是 int 类型或 List[String] 类型的字段中的序列化问题,它是一个字段,在每个元素中都是一个列表,列表中始终有 2 个元素,第一个元素的值字段始终是列表 [String],而在第二个元素中,它始终是 int 类型;问题出在 value 字段中,由于这种行为,它无法推断它。

正文:

json 响应:

{
  "custom_fields": [
    {
      "id": "d0c016df-e09a-492e-a7a2-cc92e1993627",
      "name": "Sprint",
      "type": "labels",
      "date_created": "1586927852599",
      "hide_from_guests": false,
      "value": [
        "64e19188-8440-4b35-8459-d49348c92e55"
      ],
      "required": false
    },
    {
      "id": "4513e77f-9866-4139-bcc5-458945db0deb",
      "name": "Story Points",
      "type": "drop_down",
      "date_created": "1579556449403",
      "hide_from_guests": false,
      "value": 1,
      "required": false
    }
  ]
}

现场问题:

价值

scala cire 代码序列化器:

  implicit val decodeCustomFields: Decoder[CustomFieldsItem] = new Decoder[CustomFieldsItem] {
    final def apply(c: HCursor): Decoder.Result[CustomFieldsItem] =
      for {
        id <- c.downField("id").as[Option[String]]
        name <- c.downField("name").as[Option[String]]
        typeF <- c.downField("type").as[Option[String]]
        date_created <- c.downField("date_created").as[Option[String]]
        hide_from_guests <- c.downField("hide_from_guests").as[Option[Boolean]]
        value <- c.downField("value").as[Option[List[String]]] // here it fails !!
        required <- c.downField("required").as[Option[Boolean]]
      } yield {
        CustomFieldsItem( id, name, typeF, date_created, hide_from_guests, value , required )
      }
  }

scala unmarshal 用于 http 响应的代码,它需要 circe 序列化器:

  private def runRequest(req: HttpRequest): Future[CustomFieldsItem] =
    Http()
      .singleRequest(req)
      .flatMap {
        res =>
          val ser = Unmarshal(res).to[CustomFieldsItem]
          ser
      }
  • 解组时消息错误:

    发生错误:C[A]: DownField(value),MoveRight,DownArray,DownField(custom_fields),DownArray,DownField(tasks)

如何改进或修复此序列化?

【问题讨论】:

    标签: scala akka circe


    【解决方案1】:

    使 CustomFields 的类型为 (CustomField[List[String]], CustomField[Int]) 并具有通用类型的 CustomField 案例类?

    问题是您的模型化并不能反映您收到的实际情况,而您之后正试图解决这个问题。如果它总是有 2 个元素,则它不是一个列表,它是一个元组。

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      相关资源
      最近更新 更多