我知道有一个像 api 这样的 xpath 可以从 Json4s 中的 JObject 中获取字段
val x = (obj "Type").asInstanceOf[JString].values
但是感觉有点麻烦,而且我不喜欢像 apis 这样的符号。我有点想要这样的东西:
implicit class JsonExtensions(json: JObject) {
def get[T <: JValue](key: String) : T.Values = {
(json key).asInstanceOf[T].values
}
}
并像这样使用它
val x = obj.get[String]("type")
但是它不编译,T 的上限是一个 JValue,所以 Id 希望能够引用所有 JValue 上的类型成员 Values。作为参考,他是JValue的狙击手:
sealed abstract class JValue extends Diff.Diffable with Product with Serializable {
type Values
def values: Values
...
}
我是 scala 的新手,如何让编译器满意?
如果有人感兴趣,这是解决方案:
implicit class JsonExtensions(json: JValue) {
def get[T <: JValue](key: String) : T#Values = {
(json key).asInstanceOf[T].values
}
}
val x = obj.get[JString]("type")
您必须指定预期类型,但 x 将指定 Json Ast 类型的基础值。所以对于JString是一个字符串,对于JObject来说它是一个Map[String,Any]
谢谢仁山娥