杰克逊JSON映射超类值

5
我正在使用Jackson 1.8.3在Spring应用程序中将Java对象映射为JSON。我的一个Java类(Child)扩展了一个库的超类(Parent),所以我不能修改它(特别是我不能添加注释)。我使用@JsonAutoDetect(JsonMethod.NONE),因为我只需要对象中的一小部分字段,而不是使用@JsonProperty。
class Parent {
  public long getId(){...};
  ...
}

@JsonAutoDetect(JsonMethod.NONE)
class Child extends Parent {

    @JsonProperty
    private String title;
}

但是,我需要的一个字段是父类中的id字段,但我不知道如何告诉Jackson注意这个字段,而不修改父类(因为我无法修改它)。

2个回答

8
如果您将注释放在getter方法上(而不是直接放在字段上),则可以重写getId()方法(如果它在超类中不是final),并向其添加注释。
class Parent {
  public long getId(){...};
  ...
}

@JsonAutoDetect(JsonMethod.NONE)
class Child extends Parent {

    private String title;

    @JsonProperty
    public String getTitle() {...}

    @Override
    @JsonProperty
    public long getId() {
        return super.getId();
    }
}

2
这是最实用的方法。但我使用了程序员布鲁斯提到的方法,因为它将不同的关注点分开。 - Ralph
1
哦,是的!方法可以被覆盖。 - Programmer Bruce

6

我无法添加注解

您可以使用混合方式添加注解。请参阅http://wiki.fasterxml.com/JacksonMixInAnnotations以获取详细信息。

根据类字段/方法结构的其余部分是什么,另一种可能有效的方法是通过ObjectMapper配置字段/方法的可见性访问。以下行演示了如何进行此类配置,但并不一定是您需要的具体配置。

mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));

我正在使用@JsonAutoDetect(JsonMethod.NONE),因为我只需要对象中的一小部分字段,而不是使用@JsonProperty。我应该意识到这是可能的。我需要更新我的博客文章。谢谢。

谢谢:我使用了mixin方法。 - Ralph
@Ralph - 怎么办?我处于完全相同的情况。 - happybuddha
1
@happybuddha:阅读链接文章:简要摘要如下:创建(抽象)Mixin类,其中仅包含此行@JsonProperty("width") abstract long getId();,然后“分配”mixin:objectMapper.getSerializationConfig().addMixInAnnotations(Child.class, MixIn.class); - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接