【问题标题】:@JsonIgnore ignored for public getter@JsonIgnore 被公共 getter 忽略
【发布时间】:2024-08-15 11:30:01
【问题描述】:

您好,我已经阅读了所有关于此的帖子,但似乎没有任何帮助

我有一个公共 getter,它指向一个我不想序列化为 Json 的循环结构。我浏览了其他帖子并尝试了建议,但没有任何效果。

目前,我正在像这样使用 ObjectMapper @JsonIgnore 和 @JsonAutoDetect:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
public class Bah {

    @JsonIgnore
    public String getFoo() { return foo; }

但是,getter 仍然被序列化到我的 Json 结构中。但是当我将 getFoo 重命名为没有 get 的东西时(例如 foo())它可以工作,但是“public getX()”似乎覆盖了@JsonIgnore

我错过了什么?我敢肯定它有些愚蠢

谢谢 彼得

【问题讨论】:

  • 如果你删除@JsonAutoDetect会发生什么?
  • 删除 JsonAutoDetect 无效。 Jackson 仍在尝试序列化 public getter。
  • 有趣的是,当我尝试制作一个独立的测试用例时,它按预期工作。所以我发布的示例可能有效。我的实际课程有些特别/不同。我的班级也有这样的 XML 注释:@XmlAccessorType(XmlAccessType.FIELD)、@XmlRootElement(name = "foo")、@XmlType(propOrder = {... Jackson 会不会和 javax.xml 打架?
  • 啊,所以你混合了 XML 和 JSON 注释......对不起,帮不上那个忙,我只做 JSON 和 JSON......

标签: java json serialization jackson


【解决方案1】:

好的,我明白了,正如预期的那样,它真的很愚蠢!

原来我的项目中有 com.codehaus.jackson 和 com.fasterxml.jackson。 ObjectMapper 来自fasterxml,注解来自codehaus >:-P

现在一切都按预期进行。谢谢大家的帮助。 P

【讨论】:

    【解决方案2】:

    尝试在您的ObjectMapper 中禁用AUTO_DETECT_GETTERS。您可以在任何实例化 ObjectMapper 的地方执行此操作,如下所示:

    ObjectMapper om = new ObjectMapper();
    om.disable(MapperFeature.AUTO_DETECT_GETTERS);
    

    或者,扩展 ObjectMapper 并在整个项目中使用自定义的:

    public class CustomObjectMapper extends ObjectMapper {
        public CustomObjectMapper() {
            disable(MapperFeature.AUTO_DETECT_GETTERS);
            // more project-wide config
        }
    }
    

    【讨论】:

    • 酷,谢谢。它还能使用@JsonProperty 序列化所需的getter 吗?
    • 是的。默认情况下,Jackson 遵循 Bean 命名约定来确定要序列化的属性;禁用AUTO_DETECT_GETTERS 将阻止杰克逊这样做。禁用该功能后,您必须为要序列化的所有字段注释 getter。
    • 啊!禁用 getter 后,现在我无法打开序列化 :-( JsonValue 和 JsonProperty 似乎没有效果。我想这与他们之前的行为一致......
    • 嗯,这很奇怪。如果您在对象映射器上禁用AUTO_DETECT_GETTERS,则不再需要@JsonAutoDetect 注释,您是否使用@JsonProperty("fieldName") 注释您的getter 并且仍然收到错误?