gpt4 book ai didi

java - 子类的 Jersey 和 Jackson 序列化不包括额外的属性

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:36 25 4
gpt4 key购买 nike

在 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;
}
}

和下面的 Jersey 代码

@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 不是抽象的

最佳答案

它应该像您展示的那样工作;有一个可能的异常(exception):如果您启用 JAXB 注释(仅),则 JAXB 限制要求仅使用 getter/setter 对来检测属性。因此,尝试为“biz”添加 setter,看看是否会改变它。

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

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

关于java - 子类的 Jersey 和 Jackson 序列化不包括额外的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6374421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com