[英]Deserialize object reference in 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的指针“取消”到“名称”(唯一的标识符)标识实例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) )。
您需要将{"$ref": "/bar.json"}
为地图。 这是存储它的最简单方法。
例:
public class Foo {
@JsonProperty("bar")
private Map<String, Bar> bar;
@JsonProperty("bar")
public Map<String, Bar> getBar() {
return bar.get("$ref");
}
@JsonProperty("bar")
public void setBar(Map<String, Bar> bar) {
this.bar = bar;
}
}
只有这样它才能在Bar对象中获得$ ref的值。 否则,数据格式将不正确,Bar对象将整个条形值输入其中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.