我试图使用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) ).