java – 在Jackson中反序列化对象引用

我试图使用ObjectMapper反序列化对象ref($ref).

 public class Foo {
    @JsonProperty("bar")
    private Bar bar;

    @JsonProperty("bar")
    public Bar getBar() {
        return bar;
    }

    @JsonProperty("bar")
    public void setBar(Bar bar) {
        this.bar = bar;
    }
}

test.json
这是我试图反序列化的json文件.
这是引用对象/ json引用的正确方法吗?

{  
  "bar": {"$ref": "/bar.json"}
}

Deserializer.java

ObjectMapper objectMapper = new ObjectMapper();
//load class
URL url = Deserializer.class.getClassLoader().getResource("test.json");

//deserialize 
objectMapper.readValue(url, Foo.class);

结果创建了一个带有“bar”附加属性的Foo pojo:“”$ref“:”/ bar.json“”而不是反序列化它.我是否需要实现反序列化接口并手动反序列化节点?

最佳答案 传统上在Comp Sc.使用所谓的“Pointer Swizzling”解决了这个问题.

这意味着如果你有一个包含对B的引用的对象A并且你想序列化这个结构(然后反序列化它),你需要将指向B的指针“unwizzle”为“name”(唯一的标识符)标识实例B),将其写入磁盘.在反序列化时,您将获取该名称,找到它指向的实例(B)并将该名称“混合”回到指向B的正确指针.

现在,在Java中,指针被称为引用,但它们是相同的.

这是一个例子来说明:

originalA = { "id":"id_a", "ref_to_b": originalB}
originalB = { "id":"id_b" }

申请未破坏:

readyForSerializationA = { "id":"id_a", "ref_to_b": "id_b"}
readyForSerializationB = { "id": "id_b" }

然后写入商店/从商店回读.

应用swizzling:

deserializedB = { "id":"id_b" }
deserializedA = { "id": "id_a", "ref_to_b": deserializedB}

为你的情况做一个可能的方法是首先反序列化所有对象,将它们放入HashMap,然后在第二遍中,从你在JSON中的各种ObjectID中查找ObjectReference(swizzling) ).

进一步阅读:https://en.wikipedia.org/wiki/Pointer_swizzling

点赞