gpt4 book ai didi

java - 如何使用 Jackson 的@JsonIdentityInfo 进行有向图的反序列化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:04 25 4
gpt4 key购买 nike

我想使用 Jackson 2.3.3 进行有向图的反序列化/序列化。我想出的结构大致如下:

public Class Graph {
private final Set<Node> nodes;
public Graph(Set<Node> nodes) { ... }
public Set<Node> getNodes() { ... }
}

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "name")
public Class Node {
private final String name;
private final Set<Edge> edges;
public Node(String name, Set<Edge> edges) { ... }
public String getName() { ... }
public Set<Edge> getEdges() { ... }
}

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "name")
public Class Edge {
private final String name;
private final Node successor;
public Edge(String name, Node successor) { ... }
public String getName() { ... }
public Node getSuccessor() { ... }
}

我希望有这个 JSON 结构:

{
"graph": [{
"name": "A",
"edges": [{
"name": "0",
"successor": "B"
}, {
"name": "1",
"successor": "A"
}]
}, {
"name": "B",
"edges": [{
"name": "0",
"successor": "A"
}, {
"name": "1",
"successor": "B"
}]
}]
}

但我在反序列化时遇到以下错误(即使在 Getters 处使用注释 @JsonProperty("name")):

com.fasterxml.jackson.databind.JsonMappingException:some.package.graph.Node 的对象 ID 定义无效:找不到名称为“name”的属性

我已经为 Jackson 1.6 找到了一些带有反向引用注释的解决方案,但我想使用新的 Jackson 2.x 注释,因为它在 Jackson 从 1.9 到 2.0 的 API 更新中做了很多广告。

我在这里错过了什么?提前感谢您的建设性回答。

编辑

(将我的答案从此处移至答案部分)

最佳答案

我有点盲目地盯着它看太久了。这是出了什么问题:

序列化实际上按预期工作。反序列化不起作用,因为 Jackson 无法实例化我的节点对象。我只是忘记正确注释构造函数方法的参数。

我现在面临另一个问题。生成的 JSON 现在看起来像这样:

"graph": {
"nodes": [{
"name": "B",
"edges": [{
"label": "1",
"successor": "B"
}, {
"label": "0",
"successor": {
"name": "A",
"edges": [{
"label": "1",
"successor": "A"
}, {
"label": "0",
"successor": "B"
}]
}
}]
}, "A"]
}

到目前为止一切顺利。但是在映射过程中,Jackson 向我提出了这个错误:

java.lang.IllegalStateException: Could not resolve Object Id [B] (for [simple
type, class some.package.graph.Node]) -- unresolved forward-reference?

我什至更改了边缘的标签,因为我认为相同的属性名称可能会使 Jackson 在这里感到困惑,但这也无济于事......

我的猜测是 Jackson 无法引用节点 B,因为它仍在构建中(您可以说它实际上是本例中的某种根)。解决这个问题的唯一方法似乎是构建所有没有边缘的节点,并在第二步中注入(inject)它们。

关于java - 如何使用 Jackson 的@JsonIdentityInfo 进行有向图的反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com