我有一个像这样的班级模型
final case class Appointment(id: Option[String] = None,
service: Option[String] = None,
start_at: Option[String] = None,
end_at: Option[String] = None,
entity: Option[String] = None,
status: Option[String] = None,
beneficiary: Option[String] = None,
)
我从两个不同的API中得到了不同结构给予JSON的响应,第一个与我的类具有相同的结构,所以要获得它的数据,这就足够了:
object Appointment {
implicit val jsonFormat: OFormat[Appointment] = Json.format[Appointment]
}
但第二个不同的是:
{
data[
{
"id": 101643,
"establishment": "some stablishment",
"id_client": 125,
"reservation_date": "2023-01-23",
"date_start": "2023-01-23T05:00:00.000000Z",
"date_end": "2023-01-23T05:00:00.000000Z",
"service": "some service",
}]
}
Here我找到了一个解决方案,当它是一种或另一种方法,但我需要一种方法来合并这两种方法。我不能改变我的类属性,也不能这样做:
object User {
implicit val jsonReads: Reads[User] = (
(JsPath \ "id").read[String] and
(JsPath \ "username").read[String] and
(JsPath \ "profile_picture").read[String] and
(JsPath \ "full_name").read[String]
)(User.apply _)
}
因为我会破坏已经存在的实现。
注意我需要Seq[Appointment]
1条答案
按热度按时间yhived7q1#
利用
orElse
它是
Reads
trait上的一个方法,允许你将多个Reads
组合成一个“回退”链。如果第一个失败,它会尝试第二个。为您希望支持的每种JSON格式创建一个单独的
Reads
,然后将它们组合在一起,创建一个支持所有格式的Reads
。这样做的细节将取决于你的类是如何设计的。例如,它们是否共享一个共同的超类型?它们是否完全独立,但可以从一种类型转换到另一种类型?
比如你可能会
或