首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套对象的jackson序列化

嵌套对象的jackson序列化
EN

Stack Overflow用户
提问于 2015-10-15 23:00:33
回答 3查看 18.6K关注 0票数 6

我对jackson通过接口序列化对象有问题。

我有课

代码语言:javascript
运行
复制
class Point implements PointView {

    private String id;

    private String name;

    public Point() {

    }

    public Point(String id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

}

它实现了

代码语言:javascript
运行
复制
interface PointView {
    String getId();
}

并且有课

代码语言:javascript
运行
复制
class Map implements MapView {

    private String id;

    private String name;

    private Point point;

    public Map() {

    }

    public Map(String id, String name, Point point) {
        this.id = id;
        this.name = name;
        this.point = point;
    }

    @Override
    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    @JsonSerialize(as = PointView.class)
    public Point getPoint() {
        return point;
    }

}

它实现了

代码语言:javascript
运行
复制
interface MapView {
    String getId();
    Point getPoint();
}

并且有课

代码语言:javascript
运行
复制
class Container {

    private Map map;

    public Container() {

    }

    public Container(Map map) {
        this.map = map;
    }

    @JsonSerialize(as = MapView.class)
    public Map getMap() {
        return map;
    }
}

我想用Jackson序列化Container并获得结果

代码语言:javascript
运行
复制
{"map":{"id":"mapId","point":{"id":"pointId"}}}

但实际上我得到了结果

代码语言:javascript
运行
复制
{"map":{"id":"mapId","point":{"id":"pointId","name":"pointName"}}}

它们在嵌套对象" Point“中具有属性"name”,尽管我将序列化类型指定为“映射中的点”(@JsonSerialize(as = PointView.class))。接口PointView没有方法getName,但在结果中存在点的字段"name“。

如果我从类容器中的方法getMap中删除注释(@JsonSerialize(as = MapView.class)),我会得到结果

代码语言:javascript
运行
复制
{"map":{"id":"mapId","name":"mapName","point":{"id":"pointId"}}}

现在点没有属性"name",但是map有。

怎样才能得到结果

代码语言:javascript
运行
复制
{"map":{"id":"mapId","point":{"id":"pointId"}}}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-17 03:12:39

为了获得所需的结果,接口中的相同方法也必须由@JsonSerialize注释

代码语言:javascript
运行
复制
interface MapView {
    String getId();
    @JsonSerialize(as = PointView.class)
    Point getPoint();
}
票数 4
EN

Stack Overflow用户

发布于 2015-10-16 15:28:40

您可以像这样注释该方法:

代码语言:javascript
运行
复制
@JsonIgnore
public String getName() {
    return name;
}

或者,如果在此用例中需要特定的序列化,而在其他用例中需要正常的序列化,则可以使用@JsonView (请参阅doc)。

它序列化name的原因是实例有访问器getName(),即使接口没有。

票数 0
EN

Stack Overflow用户

发布于 2015-10-17 00:49:42

是的,您可以使用

代码语言:javascript
运行
复制
@JsonSerialize(as=MyInterface.class)
public class ConcreteClass implements MyInterface { .... }

在实现类上(如上所述),或者在有值的属性上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33151974

复制
相关文章

相似问题

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