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

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

实际上,我有不止一个字段可以复制,因为 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"
        ]}
    }

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

谢谢,

4

1 回答 1

7

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

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

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

于 2012-11-30T13:00:40.877 回答