gpt4 book ai didi

Scala Play Framework : complex read to match multiple keys for same field in case class

转载 作者:行者123 更新时间:2023-12-01 13:17:18 25 4
gpt4 key购买 nike

我是一个 scala 新手...

假设我有一个这样的案例类:

case class Event(name: Option[String]) {}

我想用Play框架来解析它。然而,有时我会得到一个 json 有效负载,其中 key 的第一个字母是大写的,有时是小写的。像这样:

小写

{
"name": "group_unsubscribe",
}

大写

{
"Name": "group_unsubscribe",
}

我如何使用复杂的读取来解释这些可能性?

我尝试过类似的东西:

implicit val reads: Reads[Event] = (
((JsPath \ "name").readNullable[String] or
(JsPath \ "Name").readNullable[String])
)(Event.apply _)

但没有快乐:(

最佳答案

您需要将您的Reads 重写为:

implicit val reads: Reads[Event] = (
(JsPath \ "name").readNullable[String] orElse
(JsPath \ "Name").readNullable[String]
).map(Event(_))

更新 1 考虑到评论:

import play.api.libs.json.Reads

implicit val reads: Reads[Event] = (
(JsPath \ "name").read[String] orElse
(JsPath \ "Name").read[String]
).map(name => Event(Option(name)))

注意:此实现假设“name”或“Name”将始终出现在传入的 JSON 文档中。

为了捕获失败的可能性,您应该使用.validate[T] 而不是.as[T]

更新 2 考虑了进一步的评论:

您的类型中是否具有一个或多个属性并没有太大变化。如果您的类型有另一个名为 somethingElse 的字段,您需要将您的 Reads 调整为类似以下内容:

implicit val reads: Reads[Event] = (
((JsPath \ "name").read[String] orElse
(JsPath \ "Name").read[String]).map(Option(_)) ~
(JsPath \ "somethingElse").read[String]
)(Event.apply _)

关于Scala Play Framework : complex read to match multiple keys for same field in case class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53558865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com