Home > Back-end >  Scala Option and Some mismatch
Scala Option and Some mismatch

Time:11-26

I want to parse province to case class, it throws mismatch

scala.MatchError: Some(USA) (of class scala.Some)

  val result = EntityUtils.toString(entity,"UTF-8")
  val address = JsonParser.parse(result).extract[Address]

  val value.province = Option(address.province)
  val value.city = Option(address.city)
case class Access(
                    device: String,
                    deviceType: String,
                    os: String,
                    event: String,
                    net: String,
                    channel: String,
                    uid: String,
                    nu: Int,
                    ip: String,
                    time: Long,
                    version: String,
                    province: Option[String],
                    city: Option[String],
                    product: Option[Product]
                  )

CodePudding user response:

Assuming the starting point:

val province: Option[String] = ???

You can get the string with simple pattern matching:

province match {
  case Some(stringValue) => JsonParser.parse(stringValue).extract[Province] //use parser to go from string to a case class
  case None => .. //maybe provide a default value, depends on your context
}

Note: Without knowing what extract[T] returns it's hard to recommend a follow-up

CodePudding user response:

This:

val value.province = Option(address.province)
val value.city = Option(address.city)

doesn't do what you think it does. It tries to treat value.province and value.city as extractors (which don't match the type, thus scala.MatchError exception). It doesn't mutate value as I believe you intended (because value apparently doesn't have such setters).

Since value is (apparently) Access case class, it is immutable and you can only obtain an updated copy:

val value2 = value.copy(
  province = Option(address.province),
  city     = Option(address.city)
)
  • Related