我有一个带有以下对象的树形结构,需要使用Jackson进行序列化和反序列化,但无法弄清楚该怎么做。
Type
Type
有名称和版本。它也可能有一个父类型和子类型。
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "name")
final class Type {
private final PrefixedName name;
private final Integer version;
private final Set<Type> subTypes = new HashSet<>();
private final Type parent;
private final PrefixedName parentName;
Type(final PrefixedName name, final Integer version) {
this(name, version, null);
}
@JsonCreator
Type(@JsonProperty("name") @JsonDeserialize(keyUsing = PrefixedNameKeyDeserializer.class) final PrefixedName name,
@JsonProperty("typeVersion") final Integer version, @JsonProperty("parent") final Type parent) {
this.name = Objects.requireNonNull(name);
Preconditions.checkArgument(version > 0, "Version number must be positive");
this.version = version;
this.parent = parent;
if (parent != null) {
this.parentName = parent.getName();
parent.addSubType(this);
} else {
this.parentName = null;
}
}
// Other methods to add sub-types; and getters for all properties omitted
}
Model
Model
包含树的根– Type
和版本。
final class Model {
private final Integer version;
private final Type root;
@JsonCreator
Model(@JsonProperty("modelVersion") final Integer version, @JsonProperty("root") final Type root) {
this.version = version;
this.root = root;
}
使用杰克逊的ObjectMapper
进行序列化的过程符合我的预期:
{
"root":{
"parent":null,
"name":{
"localName":"Base",
"prefix":"schema"
},
"subTypes":[
{
"parent":{
"localName":"Base",
"prefix":"schema"
},
"name":{
"localName":"Person",
"prefix":"schema"
},
"subTypes":[
{
"parent":{
"localName":"Person",
"prefix":"schema"
},
"name":{
"localName":"employee",
"prefix":"schema"
},
"subTypes":[
],
"version":1
}
],
"version":1
},
{
"parent":{
"localName":"Base",
"prefix":"schema"
},
"name":{
"localName":"organisation",
"prefix":"schema"
},
"subTypes":[
],
"version":1
},
{
"parent":{
"localName":"Base",
"prefix":"schema"
},
"name":{
"localName":"CreativeWork",
"prefix":"schema"
},
"subTypes":[
{
"parent":{
"localName":"CreativeWork",
"prefix":"schema"
},
"name":{
"localName":"Journal",
"prefix":"schema"
},
"subTypes":[
],
"version":1
},
{
"parent":{
"localName":"CreativeWork",
"prefix":"schema"
},
"name":{
"localName":"Book",
"prefix":"schema"
},
"subTypes":[
],
"version":1
}
],
"version":1
}
],
"version":1
},
"version":8
}
请注意,Type
类@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "name")
上的注释意味着parent
属性仅使用name
属性编写-这是为了防止无限递归和{{ 1}} –如果有更好的方法可以做到这一点,我将很乐意改变。
但是反序列化失败,并且在设置StackOverflowException
中的NullPointerException
属性的行上出现了name
:
Type
我已经调试了代码,发现Jackson为父级捕获了this.name = Objects.requireNonNull(name);
的两个属性(如下所示的类)作为“未知”属性–我不确定这是否与问题,但可能有用。
PrefixedName
这是一个简单的AutoValue类,其中包含两个带有Jackson注释的String属性:
PrefixedName
感谢您提供的任何帮助。