当前位置: 首页 > 知识库问答 >
问题:

嵌套对象的Jackson序列化

钱言
2023-03-14

我对对象接口的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;
    }
}

我要和Jackson连载Container得到结果

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

但事实上我得到了结果

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

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

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

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

现在点没有属性"名称",但地图有。

我怎样才能得到结果

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

?

共有3个答案

狄宗清
2023-03-14

是的,你可以用

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

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

淳于玺
2023-03-14

您可以这样对方法进行注释:

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

或者,如果您希望在这个用例中实现特定的序列化,但在其他用例中实现正常的序列化,那么您可以使用@JsonView(参见文档)。

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

郝永思
2023-03-14

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

interface MapView {
    String getId();
    @JsonSerialize(as = PointView.class)
    Point getPoint();
}
 类似资料:
  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?

  • 我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?

  • 我正在尝试反序列化一个 JSON 响应,其中包含一些标准字段和一个包含子类属性的 嵌套对象,例如: 字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类: 如何让杰克逊读取 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此操作。

  • 我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。 我的对象看起来像这样。 我希望有一种方法可以将其映射到json,看起来像: 我们希望能够做到这一点,以便我们可以将属性添加到列表中。

  • 主要内容:1 编写核心类,2 运行测试本文讲解如何将一个Java对象序列化为一个json文件,然后读取该json文件读取回对象。在下面的示例中,我们创建Student类。使用Jackson存储到一个student.json文件,该文件拥有Student对象的JSON表示形式。 1 编写核心类 MainApp: 2 运行测试

  • 我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中