我一直在学习Scala,并决定使用json4s进行JSON解析。我决定使用XPath语法进行反序列化,并遇到了我从未见过的这种奇怪的语法。
val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val JInt(x) = json\"meaningOfLife"
让我感到困惑的部分就在这里
val JInt(x) = ...
我不能全神贯注于那里发生的事情,甚至不知道如何搜索此语法或其名称。谁能帮我吗? Scala是一种了不起的语言,具有许多我在其他语言(例如C ++和Java)中不习惯的简洁功能。
编辑
需要澄清的是,我很困惑,因为未定义
x,但是以某种方式将其传递给函数或构造函数,然后将其分配给返回
json\"meaningOfLife"的
JValue结果。
编辑2
经过研究和研究,我发现这与案例类有关。我能够运行以下代码。
case class MyCaseClass (x: Int)
val MyCaseClass(x) = new MyCaseClass(5)
println(x, x.getClass) // prints (5,int)
在查看了一些代码之后,这使我对正在发生的事情有了很好的理解。
val MyCaseClass(x) = MyCaseClass(5)
正在从实例化的
Int提取(由于缺乏更好的术语)
5值
MyCaseClass并将其存储到
x中,这意味着
x将是
Int类型。
在json4s的代码中,
JInt是
JValue,由
\运算符返回。所以
JInt(x)取出一个
BigInt(存储在类
JInt中),然后从我收集的值中将其放入值
x中。
但是我还有一个问题。这个过程叫什么?是否有任何文档?
请您参考如下方法:
它被称为“不可辩驳的模式匹配”,基本上等同于以下代码:
val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val x = json match {
case JInt(xMatched) => xMatched
}
换句话说,可以以这种方式使用任何适合于声明左侧模式的case类或提取器。
附录:
“不可辩驳的”表示如果无法满足该模式,则会抛出
MatchError。


