我正在尝试用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"
]}
}
(问题更多的是关于如何在我的第一个请求中隐藏第二级,我知道如何处理第二个请求。)
谢谢,
答案 0 :(得分:7)
如果你使用Jackson,它有一个功能,允许在这种情况下正确的反序列化(多态的项目列表)。您可以使用@JsonTypeInfo批注指示您希望将对象类型包含在JSON中,然后将其用于反序列化正确的实例。这是一个例子:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
public IItem {
// ...
}
这将为IItem的每个序列化表示添加一个属性,称为@class,Jackson将检测并稍后使用它来反序列化正确的对象实例。