【问题标题】:Jackson's @JsonAppend with default value杰克逊的@JsonAppend 与默认值
【发布时间】:2018-01-28 22:27:24
【问题描述】:

伙计们!我正在开发一个 Web 应用程序,我决定使用 Jackson 作为我的 JSON 处理框架。

在我愿意发送的请求数据中;假设 POJO 看起来像这样:

data class JSONEnvelope(
        @JsonProperty("obj1")
        val obj1: Obj1,

        @JsonProperty("obj2")
        val obj2: Obj2)

像这样被序列化:

{
    "obj1":{...},
    "obj2":{...}
}

但我需要向该对象添加一些元数据,比如字段meta1meta。我以为@JsonAppend 可以解决我的问题,但是我将Jackson 和Jersey 一起使用,所以我没有手动序列化对象,所以我不能使用writer.withAttribute("...", ...)

我知道this thread,但没有答案可以满足我的需求,因为我认为,为此编写自定义序列化程序有点矫枉过正,而且如果我没有“序列化原始对象的其余部分”。我很高兴有任何想法

【问题讨论】:

  • 在这种情况下,“元数据”是什么意思?它可以实现为杰克逊以正常方式映射的简单计算属性吗?
  • @PaulHicks 元数据是指附加字段,因为这个对象是根对象,远程 API 需要指定例如 JSON 版本,所以我想添加字段 "jsonrpc":"2.0" .是的,我可以将它作为字段添加到类中,但我认为它不属于那里,因为该信息不是实体状态的一部分。我不知道你所说的计算属性是什么意思
  • 计算属性只是没有设置器(或设置器什么都不做)的属性;例如,val jsonrpc = "2.0"var time = Date().getTime()。某些属性适用于信封类。如果你不修改JSONEnvelope,那么 JsonAppend 似乎是最好的选择。如果您在调用 ObjectMapper.writerFor 后无法修改 ObjectWriter,那么您必须事先进行修改,方法是覆盖您使用 @Provider 提供的 ObjectMapper 中的 writerFor 方法。
  • @PaulHicks 感谢您的许可!如果您将评论转换为答案,我很乐意接受。我什至没有想过要覆盖 writeFor,谢谢!

标签: java json serialization jackson kotlin


【解决方案1】:

the answer you cited 中的解决方案,在 ObjectMapper 中添加 mixIn,然后使用 ObjectWriter 进行配置,是一个很好的解决方案。

对于调用 ObjectMapper.writerFor 并因此阻止您调用 withAttribute 来配置 ObjectWriter 的 Jersey,一种替代方法是将属性添加到 ObjectWriter before 从 writerFor 返回它。我建议继承 ObjectMapper 并覆盖各种 writerFor 方法,在此时添加必要的属性。然后,您可以通过将 Jersey 注册为 JAX-RS 提供者来使用该 ObjectMapper:请参阅 javax.ws.rs 中的各种注释以开始使用它。 This answer 举了一个例子来说明如何做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2019-06-14
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多