@kidar2

Java Gson deserialization. Как обработать интерфейсы?

Есть у меня такие типы:
interface IBla
{
	
}

class Bla implement IBla
{
	private int field;
}

class Bla2 implement IBla
{
	private int field;
	private int field2;
}

class Foo
{
	IBla kuku;
}
Сериализация объектов класса Foo проходит нормально.
Но вот как десeриализовать полученный json обратно? Проблема в том, что надо как-то объяснить gson'у, объект какого типа брать (Bla или Bla2), чтобы правильно сделать десeриализацию. Как это можно сделать?
  • Вопрос задан
  • 3117 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Moxa
есть дикая мысль сделать Foo типизированным, не знаю насколько это будет правильно.. типа так
class Foo<T extends IBla>
{
  T kuku;
}

и десериализовывать как
Foo foo = gson.fromJson(jsonString, new TypeToken<Foo<Bla2>>() {}.getType())
Ответ написан
@bobzer
Java EE Developer
Зависит от реализации, используемой вами. В Jackson это делается так:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Bla.class, name = "Bla"),
        @JsonSubTypes.Type(value = Bla2.class, name = "Bla2")
})
interface IBla {}

Аннотацией @JsonSubTypes вы указываете список всех возможных реализаций интерфейса.
JsonTypeInfo определяет, что во входящем JSON будет поле "type", которое сообщит о том, к какому типу привести абстрактный IBla при получении JSON-сообщения.
Ответ написан
@bromzh
Drugs-driven development
Пишешь свой десериализатор/адаптер типа/создатель инстанса.
https://sites.google.com/site/gson/gson-user-guide...
Потом регистрируешь всё это, когда создаёшь Gson объект через GsonBuilder
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы