【问题标题】:Jerkson (Jackson) issue with scala.runtime.BoxedUnit?scala.runtime.BoxedUnit 的 Jerkson (Jackson) 问题?
【发布时间】:2013-04-08 04:34:52
【问题描述】:

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}}}}

【问题讨论】:

  • 我在序列化 MapWrapper 时遇到了同样的问题。在这个问题上查看其他一些java(非scala)线程,我想知道它是否因为MapWrapper有一个getter但没有一个setter,并且因为它没有两者杰克逊不认为它完全可序列化stackoverflow.com/questions/8367312/…
  • 好奇您是否尝试过 json4s?杰克森现在几乎退休了。

标签: scala jackson jerkson


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这不是上述示例的答案,但我将提供它,因为它是我类似的“BoxedUnit”场景的答案:

    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?

    A:它是“Unit”的 scala java 表示。 Jackson 的核心部分(即 java 代码)试图反序列化 scala Unit 非实体的 java 表示。

    问:那为什么会这样呢?

    A:在我的情况下,这是由带有未声明返回值的错误方法引起的下游副作用。有问题的方法包装了一个匹配子句(无意中)没有为每种情况返回一个值。由于上面描述的错误代码,Scala 动态地将捕获此方法结果的 var 声明为“Unit”。稍后在代码中,当这个 var 序列化为 json 时,就会发生 jackson 错误。

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

    【讨论】:

    • 非常感谢您的回答。我被困在这个问题上的时间最长,试图调试这个不理解的错误。我的解决方案是确保任何正在序列化的内容都是AnyRef,它有助于删除任何缺失的单元间隙
    【解决方案3】:

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

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

    而不是

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 2021-12-31
      • 2019-04-21
      • 2011-11-24
      相关资源
      最近更新 更多