我有一个小的POJO,包含一个ArrayList(items
),一个String(title
)和一个Integer(id
)。由于这是一个Object,我必须a)围绕" item"的List接口方法实现我自己的包装方法。属性或b)使items
公开(该列表会发生很多事情)。
编辑:为了使上述观点更加清晰,我需要在反序列化后访问列表 执行添加/删除/获取/等操作 - 这意味着我要么需要在我的类中编写包装方法,要么将List公之于众,我不想这样做。
为了避免这种情况,我想直接扩展ArrayList,但我似乎无法与Jackson合作。给出一些像这样的JSON:
{ "title": "my-title", "id": 15, "items": [ 1, 2, 3 ] }
我想将title
反序列化到title
字段,同样适用于id
,但是我想用items
填充我的班级。
看起来像这样:
public class myClass extends ArrayList<Integer> {
private String title;
private Integer id;
// myClass becomes populated with the elements of "items" in the JSON
}
我尝试了几种方法来实现这一点,所有这些都坍塌了,甚至包括:
private ArrayList<Integer> items = this; // total long shot
我想要完成的只是杰克逊无法做到的事情吗?
答案 0 :(得分:7)
可以使用以下模式吗?
@JsonCreator
整齐地创建由提供的JSON指定的对象。 @JsonProperty
注释指定属性 - 适用于序列化和反序列化ArrayList
magic 在于指定第一行的@JsonFormat
。它指示对象映射器 NOT 将此对象视为集合或数组 - 只需将其视为对象。
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public class MyList extends ArrayList<Integer> {
private final Integer id;
private final String title;
@JsonCreator
public MyList(@JsonProperty("id") final Integer id,
@JsonProperty("title") final String title,
@JsonProperty("items") final List<Integer> items) {
super(items);
this.id = id;
this.title = title;
}
@JsonProperty("id")
public Integer id() {
return id;
}
@JsonProperty("items")
public Integer[] items() {
return this.toArray(new Integer[size()]);
}
@JsonProperty("title")
public String title() {
return title;
}
}