Interface Jackson:反序列化没有注释和混入的接口

Interface Jackson:反序列化没有注释和混入的接口,interface,jackson,Interface,Jackson,我正在尝试创建一种使用Jackson将对象序列化和反序列化为JSON的方法,而不必依赖于注释、混入或任何特定于对象的代码(即:特定的反序列化程序)。但是,反序列化接口时遇到问题 我的想法是将对象的类名存储在JSON中。例如,如果我有以下类: MyClassOne.java package test.classes; public class MyClassOne{ private String myString; private MyClass myReference;

我正在尝试创建一种使用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;
    }
}
package test.classes;

public class MyClassTwo implements MyClass{

    private int myInt;

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

MyClassTwo.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;
    }
}
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
    }
}
我想知道这是否可行,以及如何与杰克逊一起实现

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

您可以考虑自动包含类型信息:

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

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

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

ObjectMapper mapper=new ObjectMapper();
mapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL,“_类”);
MyClass MyClass=新的MyClass2(2);
MyClassOne MyClassOne=新的MyClassOne(“你好,世界”,myClass);
字符串json=mapper.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(myClassOne);
它将生成以下JSON:

{
“_类”:“com.example.examples.foo.MyClassOne”,
“myString”:“你好,世界”,
“myReference”:{
“_类”:“com.example.examples.foo.MyClassTwo”,
“myInt”:2
}
}
但是,要反序列化上述JSON,类必须具有默认构造函数(或使用)

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

您可以考虑自动包含类型信息:

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

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

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

ObjectMapper mapper=new ObjectMapper();
mapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL,“_类”);
MyClass MyClass=新的MyClass2(2);
MyClassOne MyClassOne=新的MyClassOne(“你好,世界”,myClass);
字符串json=mapper.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(myClassOne);
它将生成以下JSON:

{
“_类”:“com.example.examples.foo.MyClassOne”,
“myString”:“你好,世界”,
“myReference”:{
“_类”:“com.example.examples.foo.MyClassTwo”,
“myInt”:2
}
}

但是,要反序列化上述JSON,您的类必须有一个默认构造函数(或use)。

我认为这不容易,您要实现Apache Avro的某些部分(将模式与数据放在一起)。我认为这不容易,您要实现Apache Avro的某些部分(将模式与数据放在一起)