杰克逊:反序列化界面,无注释和混入

时间:2019-06-21 01:06:22

标签: interface jackson

我正在尝试创建一种使用Jackson来将对象序列化和反序列化为JSON的方法,而不必依赖注释,混入或任何特定于对象的代码(即,特定的反序列化器)。但是,我在反序列化接口时遇到麻烦。

我的想法是将对象的类名称存储在JSON中。例如,如果我有以下课程:

MyClassOne.java

package test.classes;

public class MyClassOne{

    private String myString;
    private MyClass myReference;

    public MyClassOne(String myString, MyClass myReference) {
        this.myString = myString;
        this.myReference = myReference;
    }
    public String getMyString() {
        return myString;
    }
    public MyClass getMyReference() {
        return myReference;
    }
}

MyClassTwo.java

package test.classes;

public class MyClassTwo implements MyClass{

    private int myInt;

    public MyClassTwo(int myInt) {
        this.myInt = myInt;
    }
    public int getMyInt() {
        return myInt;
    }
}

我想用Jackson将MyObjectOne实例序列化为类似于以下内容的东西:

{
"_class":"test.classes.MyClassOne" ,
"myString":"Hello World",
"myReference":{
    "_class":"test.classes.MyClassTwo", 
    "myInt":2
    }
}

我想知道这是否行得通,以及如何用杰克逊实现它。

1 个答案:

答案 0 :(得分:0)

  

我的想法是将对象的类名称存储在JSON中。

您可以考虑使用enableDefaultTypingAsProperty()自动包含类型信息:

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, "_class");

  

我正在尝试创建一种使用Jackson来将对象序列化和反序列化为JSON的方法,而不必依赖注释,混入或任何特定于对象的代码(即,特定的反序列化器)。

使用您自己的问题中定义的类型考虑以下代码:

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL, "_class");

MyClass myClass = new MyClassTwo(2);
MyClassOne myClassOne = new MyClassOne("Hello World", myClass);

String json = mapper.writer()
        .withDefaultPrettyPrinter()
        .writeValueAsString(myClassOne);

它将产生以下JSON:

{
  "_class" : "com.example.examples.foo.MyClassOne",
  "myString" : "Hello World",
  "myReference" : {
    "_class" : "com.example.examples.foo.MyClassTwo",
    "myInt" : 2
  }
}

但是,要反序列化上述JSON,您的类必须具有默认的构造函数(或使用@JsonCreator)。