Gson, как написать JsonDeserializer для универсальных типизированных классов? - PullRequest
0 голосов
/ 22 июня 2011

Ситуация

У меня есть класс, который содержит универсальный тип, и он также имеет ненулевой конструктор arg.Я не хочу показывать конструктор с нулевым аргументом, потому что это может привести к ошибочным данным.

public class Geometries<T extends AbstractGeometry>{

    private final GeometryType geometryType;
    private Collection<T> geometries;

    public Geometries(Class<T> classOfT) {
        this.geometryType = lookup(classOfT);//strict typing.
    }

}

Существует несколько (известных и окончательных) классов, которые могут расширять AbstractGeometry.

public final Point extends AbstractGeometry{ ....}
public final Polygon extends AbstractGeometry{ ....}

Пример json:

{
    "geometryType" : "point",
    "geometries" : [
        { ...contents differ... hence AbstractGeometry},
        { ...contents differ... hence AbstractGeometry},
        { ...contents differ... hence AbstractGeometry}
    ]
}

Вопрос

Как мне написать JsonDeserializer, который будет десериализовать класс Generic Typed (например, Geometires)?

CHEERS:)

ps Я не думаю, что мне нужен JsonSerializer, это должно работать из коробки:)

1 Ответ

0 голосов
/ 22 июня 2011

Примечание: Этот ответ был основан на первой версии вопроса.Изменения и последующие вопросы меняют вещи.

ps Я не верю, что мне нужен JsonSerializer, это должно работать из коробки:)

Этосовсем не так.Пример JSON, который вы опубликовали, не соответствует структуре класса Java, которую вы, очевидно, хотите связать и сгенерировать.

Если вы хотите использовать JSON в таком виде из Java, вам определенно понадобится пользовательская обработка сериализации.

Структура JSON:

an object with two elements
    element 1 is a string named "geometryType"
    element 2 is an object named "geometries", with differing elements based on type

Структура Java:

an object with two fields
    field 1, named "geometryType", is a complex type GeometryType
    field 2, named "geometries" is a Collection of AbstractGeometry objects

Основные различия:

  1. Строка JSON не соответствует типу Java GeometryType
  2. Объект JSON не соответствует типу Java. Коллекция

. Учитывая эту структуру Java, подходящей структурой JSON будет

an object with two elements
    element 1, named "geometryType", is a complex object, with elements matching the fields in GeometryType
    element 2, named "geometries", is a collection of objects, where the elements of the different objects in the collection differ based on specific AbstractGeometry types

. Вы уверены, что опубликованная вами информациядействительно то, что вы хотели?Я предполагаю, что любая или обе структуры должны быть изменены.

Что касается любого вопроса о полиморфной десериализации, пожалуйста, обратите внимание, что эта проблема уже обсуждалась несколько раз на StackOverflow.com.Я разместил ссылку на четыре разных таких вопроса и ответов (некоторые с примерами кода) на Могу ли я создать экземпляр суперкласса и создать конкретный подкласс на основе предоставленных параметров .

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