猿问

为什么即使使用 @JsonIgnoreProperties 在使用 jackson

我正在尝试将带有杰克逊的 DefaultMutableTreeNode 对象序列化为 json 字符串。因此,我需要使用一个混合抽象类,它是 DefaultMutableTreeNode 类的一种代理。这可能是因为自引用字段,但我无法识别它们。


混搭班:


@JsonIgnoreProperties(ignoreUnknown = true)

public abstract class DefaultMutableTreeNodeMixIn {


    @JsonCreator

    public DefaultMutableTreeNodeMixIn(@JsonProperty Object userObject) {};




    @JsonProperty("firstChild")

    abstract TreeNode getFirstChild();


    @JsonProperty("firstLeaf")

    abstract DefaultMutableTreeNode getFirstLeaf();


    @JsonProperty("lastChild")

    abstract TreeNode getLastChild();


    @JsonProperty("lastLeaf")

    abstract DefaultMutableTreeNode getLastLeaf();


    @JsonProperty("leafCount")

    abstract int getLeafCount();


    @JsonProperty("level")

    abstract int getLevel();


    @JsonProperty("nextLeaf")

    abstract DefaultMutableTreeNode getNextLeaf();


    @JsonProperty("nextNode")

    abstract DefaultMutableTreeNode getNextNode();


    @JsonProperty("nextSibling")

    abstract DefaultMutableTreeNode getNextSibling();


    @JsonProperty("parent")

    abstract TreeNode getParent();


    @JsonProperty("path")

    abstract TreeNode[] getPath();


    @JsonProperty("previousLeaf")

    abstract DefaultMutableTreeNode getPreviousLeaf();


    @JsonProperty("previousNode")

    abstract DefaultMutableTreeNode getPreviousNode();


    @JsonProperty("previousSibling")

    abstract DefaultMutableTreeNode getPreviousSibling();


    @JsonProperty("siblingCount")

    abstract int getSiblingCount();


    @JsonProperty("isLeaf")

    abstract boolean isLeaf();


    @JsonProperty("isRoot")

    abstract boolean isRoot();

}

对象映射器:


ObjectMapper mapper = new ObjectMapper();

mapper.addMixIn(DefaultMutableTreeNode.class,DefaultMutableTreeNodeMixIn.class);

String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(serverFileTree);

System.out.println(json);

(serverFileTree 是 DefaultMutableTreeNode 类型的对象)


弑天下
浏览 105回答 2
2回答

桃花长相依

当您开始遍历他们的 getters 方法时,此类会生成循环。要打破它们,您需要使用JsonBackReference注释。你mixin可能看起来像这样:@JsonIgnoreProperties(ignoreUnknown = true)abstract class DefaultMutableTreeNodeMixIn {    @JsonCreator    public DefaultMutableTreeNodeMixIn(@JsonProperty Object userObject) {    }    @JsonCreator    public DefaultMutableTreeNodeMixIn(@JsonProperty Object userObject, @JsonProperty boolean allowsChildren) {    }    @JsonProperty("childCount")    abstract int getChildCount();    @JsonProperty("depth")    abstract int getDepth();    @JsonProperty("firstChild")    @JsonBackReference    abstract TreeNode getFirstChild();    @JsonProperty("firstLeaf")    @JsonBackReference    abstract DefaultMutableTreeNode getFirstLeaf();    @JsonProperty("lastChild")    @JsonBackReference    abstract TreeNode getLastChild();    @JsonProperty("lastLeaf")    @JsonBackReference    abstract DefaultMutableTreeNode getLastLeaf();    @JsonProperty("leafCount")    abstract int getLeafCount();    @JsonProperty("level")    abstract int getLevel();    @JsonProperty("nextLeaf")    abstract DefaultMutableTreeNode getNextLeaf();    @JsonProperty("nextNode")    abstract DefaultMutableTreeNode getNextNode();    @JsonProperty("nextSibling")    abstract DefaultMutableTreeNode getNextSibling();    @JsonProperty("parent")    abstract TreeNode getParent();    @JsonProperty("path")    @JsonBackReference    abstract TreeNode[] getPath();    @JsonProperty("previousLeaf")    abstract DefaultMutableTreeNode getPreviousLeaf();    @JsonProperty("previousNode")    abstract DefaultMutableTreeNode getPreviousNode();    @JsonProperty("previousSibling")    abstract DefaultMutableTreeNode getPreviousSibling();    @JsonProperty("siblingCount")    abstract int getSiblingCount();    @JsonProperty("isLeaf")    abstract boolean isLeaf();    @JsonProperty("isRoot")    abstract boolean isRoot();}但可能最好和最多的OOP方法是创建新的POJO,它代表你的树准备好序列化并且没有循环。

慕码人8056858

正如杰克逊的文档中所述:https ://fasterxml.github.io/jackson-annotations/javadoc/2.6/com/fasterxml/jackson/annotation/JsonProperty.html公共@interface JsonProperty标记注释,可用于将非静态方法定义为逻辑属性的“setter”或“getter”(取决于其签名),或用作逻辑属性的非静态对象字段(序列化、反序列化)财产。我确实认为您已经注释了不是属性设置器或获取器的方法。例如:@JsonProperty("previousNode")     abstract DefaultMutableTreeNode getPreviousNode();这种方法似乎没有得到属性,而是在计算一个节点。尝试删除方法上的所有注释,看看它是否解决了问题。
随时随地看视频慕课网APP

相关分类

Java
我要回答