Json Jersey反序列化:抽象类

4

我正在尝试使用Java中的Jersey/Jackson反序列化一些JSON。

以下是我的JSON示例:

    {
        "text":"toto",
        "link":"titi",
        "items":[{
            "text":"toutou",
            "link":"tata",
            "items":[{
                "text":"toto2",
                "link":"toutou2",
                "data":"tonti",
            ]}
        ]}
    }

所以我的Java模型部分看起来像这样:
public IItem {
    ...
}

public Item implements IItem {
    List<IItem> items;
    String text;
    String link;
    ...
}

public ItemData extends Item {
    String data;
    ...
}

现在,当我尝试反序列化我的JSON时,对象映射器不知道使用哪个具体类。我该如何告诉他呢?问题是我想要一个项目(带有项目数据列表的项目)。
我考虑过只使用包含所有字段(文本、链接、数据)的一个对象,但我更喜欢这种设计,因为它看起来更好。你认为这值得吗?
实际上,我有更多的字段需要复制,因为JSON结构有点更加复杂,为了清晰起见,我已经简化了它。
问题2:之后我需要再次将我的对象序列化为JSON(第一部分仅用于临时开发,稍后我将从JDBC驱动程序中填充对象),我如何告诉Jersey一次只显示一级?
即我请求“/”,我只想要第一层,答案应该是:
    {
        "text":"toto",
        "link":"titi",
        "items":[{
            "text":"toutou",
            "link":"tata",
        ]}
    }

如果我请求 /tata,答案应该是:
    {
        "text":"toutou",
        "link":"tata",
        "items":[{
            "text":"toto2",
            "link":"toutou2",
            "data":"tonti"
        ]}
    }

这个问题更多是关于如何在第一个请求中隐藏第二级,我了解如何处理第二个请求。

谢谢!


1
两个快速问题,你正在使用哪个JSON库,你是否可以更改JSON格式? - Perception
我认为这个库是Jackson。我可以改变JSON格式,但在我看来,这是表示我发送的数据的最佳方式。你有什么想法吗?添加一个对象类型的标志? - Cuva
是的,这就是我提出的建议,请参见下面的答案。 - Perception
1个回答

7
如果您正在使用Jackson,它有一个功能可以在这些情况下(多态项目列表)进行适当的反序列化。您可以使用@JsonTypeInfo注释来指示您希望将对象类型包含在JSON中,然后将用于反序列化正确的实例。以下是一个示例:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
public IItem {
    // ...
}

这将向每个序列化表示的IItem添加一个属性,称为@class。Jackson将检测并在以后使用它来反序列化正确的对象实例。

谢谢你的回答。这是解决这些问题的唯一方法吗?如果你知道答案,我还添加了第二个问题:P - Cuva
1
如果可以的话,请将第二个问题单独发布,因为它与第一个问题非常不同。我现在要去上班了,等我到了公司会再看一下。另外,如果这个答案对您有所帮助,请随时接受它! - Perception

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接