首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Jersey和Jackson的子类序列化不包括额外的属性

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

Stack Overflow用户
提问于 2011-06-16 23:29:37
回答 2查看 6.4K关注 0票数 3

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

代码语言:javascript
运行
复制
@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代码

代码语言:javascript
运行
复制
@GET
public FooBase get() {
   return new Foo();
}

我得到了下面的json

代码语言:javascript
运行
复制
{"@class" => "foo", "bar" => null}

但我真正想要的是

代码语言:javascript
运行
复制
{"@class" => "foo", "bar" => null, "biz" => null}

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

代码语言:javascript
运行
复制
<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-18 01:25:41

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

这不会发生在Jackson批注中;理想情况下,如果您将Jackson和JAXB批注结合使用,也不会出现这种情况(我以为Jersey支持这两种批注)。如果还启用了Jackson注解处理,那么在'getBiz‘旁边添加@JsonProperty也应该可以做到这一点。

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

票数 3
EN

Stack Overflow用户

发布于 2011-06-22 18:40:06

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

代码语言:javascript
运行
复制
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class FooBase {
    private String bar;
}

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo extends FooBase {
    private String biz;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6374421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档