Я пытаюсь создать способ сериализации и десериализации объектов в 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;
}
}
Я хотел бы использовать Джексона для сериализации экземпляров MyObjectOne во что-то похожее на:
{
"_class":"test.classes.MyClassOne" ,
"myString":"Hello World",
"myReference":{
"_class":"test.classes.MyClassTwo",
"myInt":2
}
}
Мне было интересно, может ли это сработать и как добиться этого с Джексоном.





An idea that I had was to store the class name of the object within the JSON.
Вы можете рассмотреть enableDefaultTypingAsProperty() для автоматического включения информации о типе:
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, "_class");
I am trying to create a way to serialize and deserialize objects to JSON using Jackson without having to rely on annotations, mix-ins or any code that is object-specific (ie: specific deserializers).
Рассмотрим следующий код, используя типы, определенные в вашем собственном вопросе:
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).
Я не думаю, что это может быть легко, вы собираетесь реализовать некоторую часть Apache Avro (помещая схему вместе с данными) avro.apache.org/docs/current