Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归结构的jackson序列化_Java_Data Structures_Tree_Jackson - Fatal编程技术网

Java 递归结构的jackson序列化

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;

我有一个由jackson序列化的java模型:

@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;
        }

    }
}