json - Scala 模式匹配多种类型

标签 json scala pattern-matching

我有一个从 JValue 中提取 Int 的代码,对于多个 JValue 子类来说应该看起来完全相同,所以我试图避免重复我自己。然而,事实上(见下文),scala 认为 j 是一个通用的 JValue,并且 j.values 返回类型的值Values,当然,它没有 isValidInttoInt 方法。

jvalue \ name match {
  case j @ (JInt | JDecimal | JDouble) => {
    val num = j.values
    if (num.isValidInt) num.toInt.success else reportError(name + " is not a valid int")
  }

问题是避免重复的正确方法是什么?我不太热衷于将 JValue 转换为字符串,因为此代码适用于刚刚从字符串解析为 AST 的 json。我开始考虑为我需要的三种类型编写包装器,从这些类型到包装器的匹配和隐式转换器,然后为这些包装器创建一个父类(super class)以用作模式,但我不确定如何实现它。 p>

是的,我意识到这里有多个类似的问题(例如 thisthis ),但每个问题最多只包含解决方案的一部分。

最佳答案

实现一个提取器以从任意 json 值中获取 Int 值,然后在您的问题匹配中使用该提取器。

object JsonInt {
  def unapply(json: JValue): Option[Int] = json match {
    case JInt(i) if i.isValidInt => Some(i.toInt)
    case JDecimal(d) if d.isValidInt => Some(d.toInt)
    case JDouble(d) if d.isValidInt => Some(d.toInt)
    case _ => None
  }
}

jvalue \ name match {
  case JsonInt(num) => num.success
  case _ => reportError(s"$name is not a valid int")
}

关于json - Scala 模式匹配多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054194/

相关文章:

ios - 如何从这个 JSON 数组中提取这个特定节点?

java - 将 Jackson2 与 Spring 4.0 (MVC + REST+ Hibernate) 结合使用

java - 匹配规则集与 Java 中的输入数据集

pattern-matching - elixir 函数签名中的 "<>"运算符是什么?

java - 在 Java 字符串中查找数学运算符?

javascript - 当缓存硬重新加载时,我的toggleClass函数有时仅适用于我的JSON创建的字段

c# - 在 C# 中使用 Newtonsoft 反序列化 JSON

Scala case class.type 不带参数

Scala REPL ~20 秒启动——这正常吗?

scala - 用Scala,Apache Spark编写的编译错误保存模型