Есть ли способ сказать GSON для анализа строк с именами типов в начале? - PullRequest
0 голосов
/ 22 июня 2011

из Джерси классический вывод JSON List выглядит так:

{"SubtaskType":{"id":"4","name":"mozaika","metric":"m2","code":"104"}}

Но GSON скажет, что это не массив JSON, и экспериментально он принимает:

{"id":"4","name":"mozaika","metric":"m2","code":"104"} for single SubtaskType.

Я протестировал его с помощью валидатора JSON, и кажется, что обе формы приемлемы.

Вывод GSON в List выглядит следующим образом:

[{"name":"aa","metric":"m2","id":1,"code":200},{"name":"bb","metric":"m","id":2,"code":300}]

Есть ли способ настроить GSON для анализа / генерации более длинной формы (с именем типа)?

Edit:

Это структура (добавлена ​​для изменения / обсуждения):

public class SubtaskType {
private int id;
private String name;
private String metric;
private int code;

//getters & setters
}

1 Ответ

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

Примечание: Этот ответ основан на оригинальной версии вопроса.

из Джерси классический вывод JSON из List выглядит так:

{"SubtaskType":{"id":"4","name":"mozaika","metric":"m2","code":"104"}}

В самом деле? Это не массив JSON, то есть список. Это объект с одним элементом с именем «SubtaskType», для которого значением элемента является объект с четырьмя элементами. Там нет списка.

Так выглядит список с одним компонентом? Выходит ли список с двумя компонентами как

{"SubtaskType":[{"id":"4","name":"mozaika","metric":"m2","code":"104"},{"name":"bb","metric":"m","id":2,"code":300}}

Если это так, и вы должны получить такой плохо сгенерированный * JSON, и вы должны использовать Gson, то вам придется реализовать пользовательскую обработку десериализации для обработки ситуации, когда это иногда список, а иногда объект , Это слишком часто встречающаяся проблема. У Gson, к сожалению, пока нет простой конфигурации для решения этой часто возникающей проблемы. Я опубликовал пример такой пользовательской обработки десериализации в ответ на вопрос на Разбор JSON с GSON, объект иногда содержит список, иногда содержит объект

* То, что это действительно JSON, не означает, что это не дерьмо. API должен генерировать последовательно структурированный JSON. Все, что меньше, это дерьмо.

Вывод GSON в List выглядит следующим образом:

[{"name":"aa","metric":"m2","id":1,"code":200},{"name":"bb","metric":"m","id":2,"code":300}]

Хорошо. Вот как должен выглядеть список в JSON.

Есть ли способ настроить GSON для анализа / генерации более длинной формы (с именем типа)?

Да. Конкретное решение зависит от того, как в настоящее время выглядит ваша структура данных Java, и можете ли вы изменить структуру, чтобы она соответствовала желаемому JSON. Если вы не можете изменить структуру данных Java соответствующим образом, то вы должны настроить сериализацию / десериализацию пользовательского процесса. Опубликуйте структуру данных Java, которую вы хотите использовать, и укажите, можно ли ее изменить.

Кроме того, опубликуйте точный пример JSON «более длинной формы», который вы хотите сгенерировать, который представляет собой список как минимум из двух компонентов. Вы еще этого не сделали. Так что мне остается только догадываться, что ты действительно хочешь делать.

Кажется, довольно ясно, что вам нужна обработка полиморфного типа в любом окончательном решении. Это потребует специальной обработки десериализации, если используется Gson.

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

Для полиморфной сериализации не только, вероятно, потребуется реализовать настраиваемую сериализацию для генерирования желаемого элемента типа, но для того, чтобы убедить Gson сериализовать все поля из полиморфных типов, также требуется специальная обработка. См. Сериализация списка интерфейсов GSON для получения дополнительной информации.

...