Джексон: десериализовать интерфейс без аннотаций и дополнений - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь создать способ сериализации и десериализации объектов в 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
    }
}

Мне было интересно, может ли это сработать и как этого добиться с Джексоном.

1 Ответ

0 голосов
/ 24 июня 2019

Идея заключалась в том, чтобы сохранить имя класса объекта в JSON.

Можно рассмотреть enableDefaultTypingAsProperty() для автоматического включения типаинформация:

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

Я пытаюсь создать способ сериализации и десериализации объектов в 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...