@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риализацию. Как это можно сделать?
  • Вопрос задан
  • 3089 просмотров
Пригласить эксперта
Ответы на вопрос 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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
07 мая 2024, в 18:09
2000 руб./за проект
07 мая 2024, в 17:40
300 руб./за проект