用Jackson序列化和反序列化树结构

时间:2020-02-15 14:23:30

标签: java serialization data-structures tree jackson

我有一个带有以下对象的树形结构,需要使用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

感谢您提供的任何帮助。

0 个答案:

没有答案
相关问题