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

标签 java json serialization jackson directed-graph

我想使用 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/

相关文章:

java - 运行 Maven 测试时 Cucumber 测试未执行

c# - 遍历二叉树

java - 我正在面试一个使用 Spring Framework 的 j2EE 职位;帮我刷一下

javascript - 根据从表单中选择的值在屏幕上显示数据

c# - 将没有属性的类标记为可序列化是没有意义的吗?

Django 将日期时间序列化为 QuerySet/Dict 中的 json

java - immutableList 但仍然可以修改列表中的元素

javascript - 用 Node.js 编写 JSON

json - 从 github 安装 NPM 依赖项

javascript - 如何将对象中的字符串值转换为数字和 bool 值?