2013-08-14 2 views
4

Мы используем шаблон Spring rest и поставщик jackson json для сериализации/десериализации json. Из моих служб я отправляю связанныйHashSet обратно, который получает конвертацию в HashSet на стороне клиента, когда я его получаю. Из-за этого я теряю порядок вставки элементов. Это стандартная реализация поставщика Jackson Json для Set? Есть ли другой способ, поэтому он может десериализоваться для правильной реализации? Я чувствую, что это будет сложно, но материалы будут высоко оценены вами, ребята.Jackson json provider linkedHashSet десериализация

Благодаря

+2

Попробуйте положить '@JsonDeserialize (as = LinkedHashSet.class)' на сеттер? Кроме того, если это актуально для правильной функции программы, которую задают множество, на самом деле не так уж и больно объявлять поле как «LinkedHashSet», а не «Set». – Affe

+1

с помощью @JsonDeserialize (as = LinkedHashSet.class) на сеттере! спасибо –

ответ

20

Вы можете указать конкретный класс для Jackson для использования с аннотацией @JsonDeserialize. Просто поместите:

@JsonDeserialize(as=LinkedHashSet.class)

На сеттера свойства.

1

Это все зависит от того, что вы задаете тип результата будет: если задать данные, которые будут отображаться в LinkedHashSet, то JSON массив получает отображается на него. Если вы используете неопределенный тип, например java.lang.Object (или java.util.Collection), вы получите ArrayList для массивов JSON. Имейте в виду, что JSON - это данные, а не объекты (по умолчанию), поэтому метаданные по используемым вами типам Java не передаются по умолчанию. Есть способы сделать это, если вам это нужно, но обычно вам просто нужно предоставить ожидаемый тип.

+1

привет спасибо за информацию, поэтому кажется, что HashSet является реализацией по умолчанию, выбранной Jackson для наборов Set. Я использовал @JsonDeserialize (as = LinkedHashSet.class), чтобы де-сериализовать его на связаннуюHashset. Проблема заключается в том, что в проектах мы используем такие интерфейсы, как Set, List и т. Д. Для коллекций вместо создания поля, HashSet myField; поэтому я думаю, что эта проблема будет решена многими. –

+2

Да, это самый простой и эффективный набор. Однако вы можете легко переопределить это значение по умолчанию. 'SimpleModule' имеет' addAbstractTypeMapping', где вы можете передать 'Set' и' LinkedHashSet', чтобы поменять настройки по своему усмотрению. – StaxMan

Смежные вопросы