【问题标题】:Json4s alternative api with scala generics / type members具有scala泛型/类型成员的Json4s替代api
【发布时间】:2017-11-02 13:31:38
【问题描述】:

我知道有一个类似 api 的 xpath 可以从 Json4s 中的 JObject 中获取字段

val x = (obj \ "Type").asInstanceOf[JString].values

但是感觉有点麻烦,而且我不喜欢 api 之类的符号。我有点想要这样的东西:

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,所以我希望能够引用所有 JValue 上的类型成员 Values。作为参考,他是 JValue 的狙击手:

sealed abstract class JValue extends Diff.Diffable with Product with Serializable {
    type Values
    def values: Values
...
}

我是 scala 新手,如何让编译器满意?

【问题讨论】:

标签: scala generics json4s scala-generics type-members


【解决方案1】:

如果有人感兴趣,这里是解决方案:

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]

谢谢你的疯子

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2015-07-09
    • 2020-03-27
    • 2021-06-11
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2021-08-22
    相关资源
    最近更新 更多