implicit val formats = DefaultFormats
val p = each_rsvp.extract[RSVPData]
p.venue.getOrElse(default = None)
我使用案例类完成了提取。 RSVPData是一个案例类,定义如下:
case class RSVPData(
venue: Option[VenueDetails] = None,
visibility: String,
response: String,
guests: Int,
member: MemberDetails,
rsvp_id: Long,
mtime: Long,
event: EventDetails,
group: GroupDetails
)
如上所示,参数'venue'是VenueDetails类型的可选字段,也是一个案例类。
case class VenueDetails(venue_name: String, lon: Double, lat: Double, venue_id: Int)
当我这样做时:
p.venue.getOrElse(Default=None)
我得到的输出为:
VenueDetails(Waller Creek Pub House,-97.73584,30.266438,24179503)
以上内容以“带可序列化的产品”的形式返回。如何从VenueDetails案例类中分别从此输出中提取地址名称,纬度,经度,场地ID等数据。
答案 0 :(得分:2)
我将假设p
是RSVPData
项。正确? (
在.getOrElse
上使用Option
时,如果未定义任何值(即值None
),则会尝试提供默认值。换句话说,getOrElse
使您有机会在没有可用时提供默认场地详细信息,以便您可以以一致的方式处理这两种情况。在您的情况下,此参数应该是VenueDetails
的实例。
如果None
的值为{{1 - 这没什么意义。更糟糕的是,getOrElse
现在返回两种类型的值:None
或Option
。因此, Scala 将返回类型确定为这两种类型共有的特征,它们已确定为None
。因此,您无法将返回值视为getOrElse
,因此您无法访问其成员。
一般经验法则:永远不会将VenueDetails
传递给None
! ; - )
(顺便说一句,在调用中指定参数名称是不必要的; Product with Serializable
更简单,相当于VenueDetails
。)
所以,现在它取决于你正在尝试做什么,而你的问题并不清楚。我将尝试提供一些例子......
这第一个例子比功能性更为必要。它试图打印出场地的细节:
None
这是一个功能稍强的版本:
Option.getOrElse
此版本使用默认的VenueDetails实例,以了解场地详情未知的情况:
p.venue.getOrElse(None)
在后一种情况下,如果p.venue为None,则将打印以下内容:
p.venue.getOrElse(default = None)
但是,如果根据您的示例定义了p.venue,则将打印以下内容:
// Is the venue defined? (If None, then it's undefined.)
if (p.venue.isDefined) {
// Retrieve the defined details. Note that get throws an exception if p.venue is None.
// BTW, detail's type is inferred to be VenueDetails.
val details = p.venue.get
println(s"Venue: ${details.venue_name}, loc: (${details.lon}, ${details.lat}), id: ${details.venue_id}")
}
// Handle the case where the venue details are undefined.
else {
println("Venue details are unknown")
}
答案 1 :(得分:-1)
我希望这会奏效:
p.venue.map(_.venue_name).getOrElse(None)