【问题标题】:Convert a Map into Scala object将 Map 转换为 Scala 对象
【发布时间】:2021-08-08 07:30:58
【问题描述】:

参考 [Stackoverflow] Scala: convert map to case class 我尝试复制其中一个响应,但看到以下错误:

Cannot construct instance of 'com.practice.scala.Test' (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: UNKNOWN; line: -1, column: -1]

代码:

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.ScalaObjectMapper

case class Test(k1: Int, k2: String, k3: String)

object Workspace {
  def fromMap[T](map: Map[String, Any])(implicit m: Manifest[T]): T = {
    val mapper = new ObjectMapper() with ScalaObjectMapper
    mapper.convertValue(map)
  }

  def main(args: Array[String]): Unit = {
    val myMap = Map("k1" -> 1, "k2" -> "val2", "k3" -> "val3")
    val result = fromMap[Test](myMap)
    println(result)
  }
}

这个错误说明了什么?我错过了什么吗?

【问题讨论】:

    标签: scala jackson


    【解决方案1】:

    您需要在映射器上注册DefaultScalaModule

    // With 2.10 and later
    val mapper = JsonMapper.builder()
      .addModule(DefaultScalaModule)
      .build()
    
    // versions before 2.10 (also support for later 2.x but not 3.0)
    val mapper = new ObjectMapper()
    mapper.registerModule(DefaultScalaModule)
    

    来源:https://github.com/FasterXML/jackson-module-scala#usage

    【讨论】:

    • 感谢 @Gaël J DefaultScalaModule 上的映射器在本地工作,但是当我在 Databricks 上运行相同时它会引发错误。 link
    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2011-12-23
    • 2014-04-04
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多