如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?

Posted

技术标签:

【中文标题】如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?【英文标题】:How to change Jackson to detect all fields in a POJO, other than only public ones? 【发布时间】:2020-06-14 01:37:23 【问题描述】:

在项目中使用 Spring Boot 时,Jackson 默认序列化对象来回和来自 Jsons。我意识到如果您没有公共访问器,例如 getter/setter 或 POJO 中的公共字段,Jackson 会失败。

当我切换到 Gson 时,行为有所不同。它检测所有字段,无论其可见性如何。出于这个原因,我最终使用了 Gson。

我对切换我的 POJO 访问规则感到有些不舒服;这将迫使对项目结构进行一些重构。

所以,使用 Gson 没有问题,但是有没有办法改变杰克逊的行为?

【问题讨论】:

【参考方案1】:

尝试在 ObjectMapper 级别设置可见性,

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

【讨论】:

【参考方案2】:

Jackson 确实支持从私有成员字段中读取值,但默认情况下不支持。

您可以在 Spring Boot 配置中全局配置行为

jackson:
  visibility.field: any
  visibility.getter: none
  visibility.setter: none
  visibility.is-getter: none

(此配置将只查找成员字段,不再检查 get、set 和 is 方法)

您还可以使用 @JsonAutoDetect 注释对特定类进行相同的设置。

【讨论】:

感谢您的回答。我在这个link 中找到了注释解决方案。不过,您的 Spring Boot 配置替代方案似乎更好。我只需要在一个地方改变行为,而不是到处散布注释。

以上是关于如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在所有请求中传输动态auth值,而不是在SOAPUI中更改每个请求的标头中的值

使用GSON将更改字段名称映射到POJO

使用 Jackson 忽略 JSON 对象上的新字段 [重复]

为啥杰克逊还要序列化瞬态成员?

使用 POJO 仅更新 JOOQ 记录中更改的字段

如何区分空值字段与杰克逊库中的缺失字段