【问题标题】:Scala Option and Some mismatchScala 选项和一些不匹配
【发布时间】:2021-11-25 13:00:52
【问题描述】:

我想将省解析为案例类,它会抛出不匹配

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]
                  )

【问题讨论】:

  • 我不得不做很多猜测(例如value 的类型是什么),您能否改写问题以使其更清楚?
  • 首先,这些运算符出现在地图函数中。所以value是mapper的输入,type是Access。
  • 我正在使用 Json4s 将 Json 解析为案例类。事情变得复杂了,我需要先解析 json 来清理数据。省和市是后来从ip分析得到的。我想在第二次解析期间解析它们。它发生了不匹配,复制可能是一种方式。

标签: scala apache-flink


【解决方案1】:

这个:

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

没有做你认为它做的事。它尝试将value.provincevalue.city 视为extractors(与类型不匹配,因此scala.MatchError 异常)。 value 不会像我想的那样发生变异(因为 value 显然没有这样的设置器)。

由于value (显然)是Access 案例类,它是不可变的,您只能获取更新的副本:

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

【讨论】:

    【解决方案2】:

    假设起点:

    val province: Option[String] = ???
    

    你可以通过简单的模式匹配得到字符串:

    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
    }
    

    注意:在不知道 extract[T] 返回什么的情况下,很难推荐后续行动

    【讨论】:

      猜你喜欢
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      相关资源
      最近更新 更多