Сериализованный JSON с отсортированными ключами, используя Джексона - PullRequest
10 голосов
/ 28 февраля 2012

Я пытаюсь заменить пользовательскую сериализацию JSON (de) в проекте groovy / grails на Jackson.

У меня проблемы с тем, чтобы Джексон вывел симпатичный напечатанный JSON с ключами, отсортированными в простом «естественном» алфавитном порядке. Я пробовал это (и много вариантов):

mymap = [ ... ] // Some groovy map
def mapper = new ObjectMapper()
mapper.configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY, true)
def jsonstring = mapper.defaultPrettyPrintingWriter().writeValueAsString(mymap)

Но Джексон упорно генерирует JSON, где ключи, кажется, в случайном порядке. Я попытался изменить тип «mymap» с помощью TreeMap, и в этом случае все ключи правильно отсортированы, как и ожидалось.

Мне интересно, есть ли способ отсортировать ключи без изменения «mymap» выше на TreeMap (и рекурсивно все его значения карты ...).

SORT_PROPERTIES_ALPHABETICALLY, похоже, предназначен именно для этого, но по какой-то причине он этого не делает. Знаете ли вы, почему это так? Что-то я не так делаю выше?

Я пробовал с Джексоном 1.8.3, 1.8.8 и 1.9.5, тот же результат (случайные ключи).

Ответы [ 3 ]

16 голосов
/ 04 ноября 2014

Как указано @tim_yates, это не работает для ключей карты.

Вы можете использовать

mapper.configure(SerializationConfig.Feature.ORDER_MAP_ENTRIES_BY_KEYS, true)

В более новой версии (> = 2.6.1) API изменен на:

mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
4 голосов
/ 28 февраля 2012

Документация для SORT_PROPERTIES_ALPHABETICALLY прямо говорит:

Функция, определяющая порядок сериализации свойств по умолчанию, используемый для полей POJO (примечание: не применяетсяк сериализации карты!)

Так что я думаю, вам нужно будет изменить входную карту (как вы говорите)

1 голос
/ 28 февраля 2012

Как указывалось, эта функция работает только для POJO.Тем не менее, я думаю, что есть функция запроса сделать то же самое для Карт, в Джексон Джира ;и если нет, то это звучит как хорошее дополнение.

Но в то же время я бы предложил @tim_yates предложение использовать промежуточный TreeMap для сортировки, сериализовав что: упорядочение Map будет использоваться как есть, так что это должноработа.

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