【问题标题】:Jersey and Jackson serialization of subclasses does not include extra attributes子类的 Jersey 和 Jackson 序列化不包括额外的属性
【发布时间】:2011-09-16 11:52:35
【问题描述】:

在 Jersey 中,当使用 Jackson 进行 JSON 序列化时,不包括实现子类的额外属性。例如,给定以下类结构

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Foo.class, name = "foo")
}
public abstract class FooBase {
    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar( String bar ) {
        this.bar = bar;
    }
}

public class Foo extends FooBase {
    private String biz;

    public String getBiz() {
        return biz;
    }

    public void setBiz( String biz ) {
        this.biz = biz;
    }
}

还有下面的泽西代码

@GET
public FooBase get() {
   return new Foo();
}

我得到以下 json

{"@class" => "foo", "bar" => null}

但我真正想要的是

{"@class" => "foo", "bar" => null, "biz" => null}

另外,在我的 web.xml 中,我启用了 POJOMappingFeature to solve this issue

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

编辑:修复了 Java 代码以正确设置 setter 并且 Foo 不是抽象的

【问题讨论】:

  • Foo类def真的是抽象的吗?
  • FWIW 仅使用 Jackson(不带 Jersey),该示例按预期序列化为 {"@class":"foo","biz":null,"bar":null}
  • 修复了抽象的 Foo 问题
  • 程序员 Bruce - 是的 - 我也发现了,如果我使用直接对象映射器,它会正确序列化 - 或者如果我返回 Object,它会正确序列化 - 只有当我使用抽象类作为返回类型时它没有正确序列化

标签: java json jersey jackson


【解决方案1】:

使用POJOMappingFeature,您还可以使用 JAXB 注释您的类:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class FooBase {
    private String bar;
}

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo extends FooBase {
    private String biz;
}

【讨论】:

    【解决方案2】:

    它应该像你展示的那样工作;有一个可能的例外:如果您启用 JAXB 注释(仅),则 JAXB 限制要求仅使用 getter/setter 对来检测属性。 所以尝试为 'biz' 添加设置器,看看是否会改变它。

    Jackson 注释不会发生这种情况;理想情况下,如果您将 Jackson 和 JAXB 注释结合起来(我认为 Jersey 启用了两者),则理想情况下不会。 如果还启用了 Jackson 注释处理,则在“getBiz”旁边添加 @JsonProperty 也应该可以解决问题。

    最后,除非您需要 JAXB 注释,否则您可以只使用 Jackson 注释——在我看来,JAXB 注释的主要用例是如果您需要同时生成 XML 和 JSON,并使用 JAXB(通过 Jersey)对于 XML。否则它们对 JSON 没有用处。

    【讨论】:

    • Doh - 抱歉,在制作示例时 - 我把代码弄乱了,试图让它更简单(应该是 setBiz)
    • 我认为是导致问题的抽象类 - 我认为这是一个泛型问题(抽象类在实际代码中有一个参数) - 有时我会整理一个完整的示例很快。
    • 是的——Java类型擦除可以扔扳手;因为唯一存在的泛型是字段/方法声明和超类型声明中的泛型。代码内的东西只是隐式转换,在运行时不可用。
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 2018-08-10
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多