Scala将Json读取为Map [String,T]

时间:2019-12-28 19:09:18

标签: scala jackson

我正在尝试使用Scala代码阅读以下json结构,但无法将其作为case类对象读取。

  "a": {
    "source": [
      {
        "name": "test",
        "basePath": "/Users/bounce/anuj/data/test",
        "granularity": "None"
      },
      {
        "name": "test1",
        "basePath": "/Users/bounce/anuj/data/test1",
        "granularity": "None"
      }
    ]
  }
}

下面是我正在使用的代码:

    val mapper = new ObjectMapper().registerModule(DefaultScalaModule)
    val mapData = mapper.readValue(source, classOf[Map[String,FactConfig]])


      @JsonInclude(Include.NON_EMPTY)
      case class Source(name: String,
                  basePath: String,
                  granularity: String)

      case class FactConfig(
      source : List[Source])

      val d = mapData.get("a").asInstanceOf[FactConfig]


当我尝试将其转换为FactConfig对象时,我遇到了异常

Exception in thread "main" java.lang.ClassCastException: scala.collection.immutable.Map$Map1 cannot be cast to com.bounce.dp.etl.config.FactConfig

请向我建议我在做什么错。

1 个答案:

答案 0 :(得分:0)

在Java和Scala世界中,我们通常在编译过程中丢失通用类型信息。通过使用classOf操作员,杰克逊不知道它应该如何使用映射键和值。解决方法是使用com.fasterxml.jackson.core.type.TypeReference,即

val mapData = mapper.readValue(source, new TypeReference[Map[String, FactConfig]] {})