【问题标题】:Json Jersey Deserialize : Abstract ClassJson Jersey 反序列化:抽象类
【发布时间】:2012-11-18 15:52:13
【问题描述】:

我正在尝试用 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 驱动程序填充对象),我怎么知道球衣一次只显示一个级别?

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

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

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

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

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

谢谢,

【问题讨论】:

  • 两个小问题,您使用的是什么 JSON 库,是否允许更改 JSON 格式?
  • 我认为图书馆是杰克逊。而且我可以更改 JSON 格式,但在我看来,这是表示我正在发送的数据的最佳方式。你有什么想法 ?为对象类型添加标志?
  • 是的,这就是我的建议,请参阅下面的答案。

标签: java json jersey deserialization


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。这是解决这些问题的唯一方法吗?如果您知道答案,我还添加了第二个问题:P
  • 如果可以的话,单独发布第二个问题,它与第一个完全不同。我要去上班,但我进去后会看看。另外,如果这个答案对你有帮助,请随时接受!
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 2016-07-07
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2011-04-07
相关资源
最近更新 更多