【问题标题】:Jackson JSON mapping of superclass value超类值的杰克逊 JSON 映射
【发布时间】:2011-07-13 15:54:09
【问题描述】:

我在 Spring 应用程序中使用 Jackson 1.8.3 将 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注意这个字段,而不修改父类(因为我不能修改它)。

【问题讨论】:

    标签: java json spring jackson


    【解决方案1】:

    如果您将注释放在 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】:

    我无法添加注释

    您可以使用 mix-ins 添加注释。详情请见http://wiki.fasterxml.com/JacksonMixInAnnotations

    根据类字段/方法结构的其余部分是什么,另一种可行的方法是通过 ObjectMapper 配置字段/方法的可见性访问。下面一行演示了如何进行这样的配置,不一定是你需要的具体配置。

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

    我使用@JsonAutoDetect(JsonMethod.NONE) 因为我只需要对象中的一小组字段,而不是我使用@JsonProperty

    我应该意识到这是可能的。我必须更新我的博客文章。谢谢。

    【讨论】:

    • 谢谢:我使用了 mixin 方法
    • @Ralph - 怎么样?我的情况完全一样。
    • @happybuddha:阅读链接文章:在一个非常简短的摘要中:创建(抽象)Mixin 类,其中只包含这一行@JsonProperty("width") abstract long getId();,然后“分配”mixin:objectMapper.getSerializationConfig().addMixInAnnotations(Child.class, MixIn.class);跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多