Json Jersey反序列化:抽象类

时间:2012-11-30 12:11:02

标签: java json jersey deserialization

我正在尝试用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时,对象映射器不知道要使用的具体类。 我怎么告诉他这个?问题是我想要一个Item(带有Item列表(带有ItemData列表))。

我虽然只使用了一个包含所有字段(文本,链接,数据)的对象,但我更喜欢这种类似的设计,它看起来更好。你认为这值得吗?

实际上我有多个字段可以复制,因为JSON结构有点复杂,我为了清楚起见简化了它。

Question2 :之后我需要在JSON中再次序列化我的对象(第一部分仅用于临时开发,稍后我将从JDBC驱动程序中填充对象),我该如何分辨球衣当时只显示一个级别?

即我请求/我只想要第一级,答案应该是:

    {
        "text":"toto",
        "link":"titi",
        "items":[{
            "text":"toutou",
            "link":"tata",
        ]}
    }

如果我要求/tata,答案应为:

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

(问题更多的是关于如何在我的第一个请求中隐藏第二级,我知道如何处理第二个请求。)

谢谢,

1 个答案:

答案 0 :(得分:7)

如果你使用Jackson,它有一个功能,允许在这种情况下正确的反序列化(多态的项目列表)。您可以使用@JsonTypeInfo批注指示您希望将对象类型包含在JSON中,然后将其用于反序列化正确的实例。这是一个例子:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
public IItem {
    // ...
}

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