为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

弑天下 2022-07-20 16:57:42
我正在尝试将带有杰克逊的 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 类型的对象)
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

当您开始遍历他们的 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,它代表你的树准备好序列化并且没有循环。


查看完整回答
反对 回复 2022-07-20
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

正如杰克逊的文档中所述:https ://fasterxml.github.io/jackson-annotations/javadoc/2.6/com/fasterxml/jackson/annotation/JsonProperty.html

公共@interface JsonProperty

标记注释,可用于将非静态方法定义为逻辑属性的“setter”或“getter”(取决于其签名),或用作逻辑属性的非静态对象字段(序列化、反序列化)财产。

我确实认为您已经注释了不是属性设置器或获取器的方法。

例如:

@JsonProperty("previousNode")
    abstract DefaultMutableTreeNode getPreviousNode();

这种方法似乎没有得到属性,而是在计算一个节点。尝试删除方法上的所有注释,看看它是否解决了问题。


查看完整回答
反对 回复 2022-07-20
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信