jackson序列化嵌套对象

时间:2015-10-15 15:00:33

标签: java json serialization jackson

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

我有课

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

}

实现

interface PointView {
    String getId();
}

并有课

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

}

实现

interface MapView {
    String getId();
    Point getPoint();
}

并上课

class Container {

    private Map map;

    public Container() {

    }

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

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

我想要与杰克逊串行化容器并获得结果

{"map":{"id":"mapId","point":{"id":"pointId"}}}

但实际上我得到了结果

{"map":{"id":"mapId","point":{"id":"pointId","name":"pointName"}}}
尽管我在Map(@JsonSerialize(as = PointView.class))中指定了Point的序列化类型,但在嵌套对象“point”中具有属性“name”的

。接口PointView没有方法getName,但结果存在Point的字段“name”。

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

{"map":{"id":"mapId","name":"mapName","point":{"id":"pointId"}}}

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

我如何获得结果

{"map":{"id":"mapId","point":{"id":"pointId"}}}

3 个答案:

答案 0 :(得分:3)

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

注释
interface MapView {
    String getId();
    @JsonSerialize(as = PointView.class)
    Point getPoint();
}

答案 1 :(得分:0)

您可以像这样注释方法:

@JsonIgnore
public String getName() {
    return name;
}

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

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

答案 2 :(得分:0)

是的,您可以使用

@JsonSerialize(as=MyInterface.class)
public class ConcreteClass implements MyInterface { .... }

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