Java 递归结构的jackson序列化
我有一个由jackson序列化的java模型:Java 递归结构的jackson序列化,java,data-structures,tree,jackson,Java,Data Structures,Tree,Jackson,我有一个由jackson序列化的java模型: @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="orderId") public class ClonedOrder extends ResourceSupport implements Serializable{ private long orderId; private ClonedOrder parent;
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="orderId")
public class ClonedOrder extends ResourceSupport implements Serializable{
private long orderId;
private ClonedOrder parent;
private List<ClonedOrder> children = new ArrayList<>();
@JsonProperty("root")
public ClonedOrder root() {
if (parent == null) {
return this;
} else {
return parent.root();
}
}
问题在于,ClonedOrder类型的根节点没有序列化为ClonedOrder(具有父节点、子节点和根节点),而仅将id序列化为long类型
问题是,我不能使用相同的模型进行序列化和反序列化,因为json在服务器和客户端之间发生变化
你知道如何实现这个目标吗?正如你之前注意到的,jackson使用
JsonIdentityInfo
long orderId序列化,它跳过标准java对象序列化以避免无限嵌套对象(意味着堆栈溢出)
我建议使用一种更简单的数据结构(如用于将这些数据存储在关系数据库中的模型)序列化所有需要的数据。我想得出的模型是:
relations: [
{"id": 163811134, "parent": 153684020},
{"id": 163811135, "parent": 163811134},
{"id": 153684020, "parent": null},
]
使用此结构,使用实用方法查找所需内容非常简单:
private class CloningRelations {
List<CloningOrder> orders;
public Long getRoot(){
for (CloningOrder o : orders)
if (o.getParent() != null)
return o.getId();
return null;
}
@JsonIgnore public List<Long> getChildrenOf(long id) {
ArrayList<Long> list = new ArrayList<>();
for (CloningOrder o : orders)
if (o.getParent() == id)
list.add(o.getId());
return list;
}
@JsonIgnore public List<Long> getDescendantsOf(long id) {
ArrayList<Long> list = new ArrayList<>();
for (CloningOrder o : orders)
if (o.getParent() == id) {
list.add(o.getId());
list.addAll(getDescendantsOf(o.getId()));
}
return list;
}
@JsonIgnore public Long getParentOf(long id) {
for (CloningOrder o : orders)
if (o.getId() == id)
return o.getParent();
return null;
}
@JsonIgnore public List<Long> getAncestorsOf(long id) {
ArrayList<Long> list = new ArrayList<>();
for (CloningOrder o : orders)
if (o.getId() == id) {
list.add(o.getParent()); //sorted too!
list.addAll(getAncestorsOf(o.getParent()));
}
return list;
}
private class CloningOrder {
long id;
Long parent;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Long getParent() {
return parent;
}
public void setParent(Long parent) {
this.parent = parent;
}
}
}
私有类关闭关系{
列出订单;
公共长getRoot(){
for(关闭订单o:订单)
如果(o.getParent()!=null)
返回o.getId();
返回null;
}
@JsonIgnore公共列表getChildrenOf(长id){
ArrayList=新建ArrayList();
for(关闭订单o:订单)
if(o.getParent()==id)
添加(o.getId());
退货清单;
}
@JsonIgnore公共列表getDegenantsOf(长id){
ArrayList=新建ArrayList();
for(关闭订单o:订单)
if(o.getParent()==id){
添加(o.getId());
addAll(getgenderantsof(o.getId());
}
退货清单;
}
@JsonIgnore公共长getParentOf(长id){
for(关闭订单o:订单)
if(o.getId()==id)
返回o.getParent();
返回null;
}
@JsonIgnore公共列表getAncestorsOf(长id){
ArrayList=新建ArrayList();
for(关闭订单o:订单)
if(o.getId()==id){
list.add(o.getParent());//也已排序!
addAll(getAncestorsOf(o.getParent());
}
退货清单;
}
私有类关闭顺序{
长id;
长亲;
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共长getParent(){
返回父母;
}
公共void setParent(长父级){
this.parent=parent;
}
}
}
您可以使用两个注释@JsonManagedReference
和@JsonBackReference
来处理双向引用
看看JSON只能包含值;该格式没有任何引用对象的定义。JSON无法处理对象引用中的表示周期。您需要在设计API和JSON模型时牢记这些约束,并相应地编写客户机和服务器代码。
private class CloningRelations {
List<CloningOrder> orders;
public Long getRoot(){
for (CloningOrder o : orders)
if (o.getParent() != null)
return o.getId();
return null;
}
@JsonIgnore public List<Long> getChildrenOf(long id) {
ArrayList<Long> list = new ArrayList<>();
for (CloningOrder o : orders)
if (o.getParent() == id)
list.add(o.getId());
return list;
}
@JsonIgnore public List<Long> getDescendantsOf(long id) {
ArrayList<Long> list = new ArrayList<>();
for (CloningOrder o : orders)
if (o.getParent() == id) {
list.add(o.getId());
list.addAll(getDescendantsOf(o.getId()));
}
return list;
}
@JsonIgnore public Long getParentOf(long id) {
for (CloningOrder o : orders)
if (o.getId() == id)
return o.getParent();
return null;
}
@JsonIgnore public List<Long> getAncestorsOf(long id) {
ArrayList<Long> list = new ArrayList<>();
for (CloningOrder o : orders)
if (o.getId() == id) {
list.add(o.getParent()); //sorted too!
list.addAll(getAncestorsOf(o.getParent()));
}
return list;
}
private class CloningOrder {
long id;
Long parent;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Long getParent() {
return parent;
}
public void setParent(Long parent) {
this.parent = parent;
}
}
}