【问题标题】:Serialize `Nothing?` property via Jackson通过杰克逊序列化“Nothing?”属性
【发布时间】:2020-03-28 10:55:45
【问题描述】:

我想通过 Jackson 序列化 FAIL 对象:

interface OptionalResult<out ResultType : Any> {

    val data: ResultType?

    object FAIL : OptionalResult<Nothing> {

        override val data: Nothing? = null
    }
}

我收到的是{},但我希望收到{"data": null}

如何修复我的对象?

顺便说一下,下面的对象被正确序列化了:

object FAIL : OptionalResult<Int> {

    override val data: Int? = null
}

【问题讨论】:

  • @JsonSerialize(using = MyCustomSerializer::class) 注释FAIL 对象有效!但是,这需要 9 行额外的代码。是否还有其他变体,例如以某种方式注释data
  • 现在好像没有办法让它更简洁了。可以在此处找到自定义序列化程序的示例:github.com/FasterXML/jackson-module-kotlin/issues/314

标签: kotlin jackson


【解决方案1】:

技术问题是,Jackson 确定通常指示存在属性(公共或带注释的 setter)的指示符将被过滤掉,因为 getter 被视为 public void getData(),它什么也不返回。 过滤是在低级处理中完成的,同时删除静态方法、既不注解也不遵循命名约定的方法等等。

由于voidVoid 之间存在实际差异(类似于原始/包装器差异),因此可能可以改进此检测。 但这是第一次报告这种用法。

您可以尝试的一件事可能会(或可能不会)有帮助:添加@JsonPropertyval data。如果只对未带注释的访问器进行过滤,这可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多