Jerkson(杰克逊)问题与scala.runtime.BoxedUnit?

时间:2013-04-15 22:28:44

标签: scala jackson jerkson

杰克逊开始抛出一个我以前从未见过的奇怪错误。

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class scala.runtime.BoxedUnit and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: scala.collection.MapWrapper["data"])

我正在从API解析一些基本数据。我定义的课程是:

case class Segmentation(
  @(JsonProperty@field)("legend_size")
  val legend_size: Int,

  @(JsonProperty@field)("data")
  val data: Data

) 

Data看起来像:

case class Data(
  @(JsonProperty@field)("series")
  val series: List[String],

  @(JsonProperty@field)("values")
  val values: Map[String, Map[String, Any]]

)

任何线索,为什么会引发错误?看起来像Jerkson可以处理的简单类。

修改:示例数据:

{"legend_size": 1, "data": {"series": ["2013-04-06", "2013-04-07", "2013-04-08", "2013-04-09", "2013-04-10", "2013-04-11", "2013-04-12", "2013-04-13", "2013-04-14", "2013-04-15"], "values": {"datapoint": {"2013-04-12": 0, "2013-04-15": 4, "2013-04-14": 0, "2013-04-08":
0, "2013-04-09": 0, "2013-04-11": 0, "2013-04-10": 0, "2013-04-13": 0, "2013-04-06": 0, "2013-04-07": 0}}}}

3 个答案:

答案 0 :(得分:2)

这不是上述例子的答案,但我会提供它,因为它是我类似的#BoxfulUnit"情形:

No serializer found for class scala.runtime.BoxedUnit and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

在我的案例中,Jackson抱怨反序列化scala.runtime.BoxedUnit对象的实例。

问:那么什么是scala.runtime.BoxedUnit?

答:" Unit"的scala java表示。 Jackson的核心部分(java代码)试图反序列化scala Unit非实体的java表示。

问:那为什么会这样呢?

答:在我的情况下,这是由具有未申报的返回值的错误方法引起的下游副作用。有问题的方法包含了一个匹配条款(无意中)没有为每个案例返回一个值。由于上面描述的错误代码,Scala动态地声明var捕获此方法的结果为" Unit"。稍后在代码中将此序列化为json时,会发生jackson错误。

因此,如果您遇到这样的问题,我的建议是检查任何带有未定义返回值的隐式类型变量/方法,并确保它们正在执行您认为正在执行的操作。

答案 1 :(得分:0)

我有同样的例外。在我的情况下导致它的原因是我在没有'='的伴随对象中定义了一个apply方法:

object Somthing {
   def apply(s: SomthingElse)  {
      ...
   }
}

而不是

object Somthing {
   def apply(s: SomthingElse) = {
      ...
   }
}

这导致apply方法返回类型为Unit,当我将对象传递给jackson时导致异常。 不确定您的代码中是否存在这种情况,或者此问题是否仍然相关,但这可能会帮助其他人解决此类问题。

答案 2 :(得分:0)

自从我第一次发布这个问题以来已经有一段时间了。写这个答案时的解决方案似乎是从Jerkson继续前进,并使用Jackson-module-scala或Json4s与Jackson后端。许多Scala类型都包含在默认序列化中,并且是本机处理的。

此外,我看到BoxedUnit的原因是因为Jerkson看到的显式类型是AnyMap[String, Map[String, Any]]的一部分)。 Any是一种基本类型,并没有给Jerkson / Jackson提供有关它反序列化的信息。因此,它抱怨缺少序列化器。