为什么我将json解析为Java List,而不是Scala List?

时间:2016-06-14 17:17:26

标签: json scala parsing jackson

我正在尝试解析包含列表的json对象。如果该字段由Java List支持,我能够解析该列表,但如果该字段由Scala列表支持,则它将失败。解析为Scala列表与Java列表之间有什么区别,我需要更改哪些内容才能将其解析为Scala列表?

object JsonParsingExample extends App {
  val objectMapper = new ObjectMapper()

  // This line succeeds. 
  objectMapper.readValue("""{"list": ["a","b"]}""", classOf[JavaList])

  // This line fails.
  objectMapper.readValue("""{"list": ["a","b"]}""", classOf[ScalaList])
}

case class JavaList() {
  @JsonProperty(value = "list")
  var myList: java.util.ArrayList[String] = null
}

case class ScalaList() {
  @JsonProperty(value = "list")
  var myList: List[String] = null
}

我收到的错误消息是:

  

com.fasterxml.jackson.databind.JsonMappingException:无法构造scala.collection.immutable.List的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化器,或者使用其他类型信息进行实例化

2 个答案:

答案 0 :(得分:1)

默认情况下,杰克逊对Scala类型一无所知(否则它必须依赖于scala-library)。要教它,请使用jackson-module-scala

答案 1 :(得分:1)

因为scala.collection.immutable.List实际上是一个抽象类。通常,当您使用List(" a"," b"," c")时,对象List.apply()来自此行:{{ 3}}并且它实际上是一个内部类(称为scala.collection.immutable。$ colon $ colon)。