我正在尝试创建一种使用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
}
}
我想知道这是否行得通,以及如何用杰克逊实现它。
答案 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
)。