问题描述
int 类型或 List[String] 类型的字段中的序列化问题,它是一个字段,在每个元素中都是一个列表,列表中始终有 2 个元素,第一个元素的值字段始终是一个列表 [String],而在第二个元素中,它始终是 int 类型;问题出在值字段中,并且由于这种行为而无法推断它。
正文:
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","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 解组 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),DownField(tasks)
我该如何改进或修复此序列化?
解决方法
使 CustomFields 成为 (CustomField[List[String]],CustomField[Int]) 类型,具有通用类型的 CustomField 案例类?
问题在于您的建模并没有反映您收到的真实情况,而您正在尝试在事后解决这个问题。如果它总是有 2 个元素,那就不是列表,而是元组。