Как сериализовать карту с ключами enum в порядке декларирования с помощью JSON? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть некоторый enum класс, давайте представим

public enum MyEnum {
    ONE("one"), TWO("two"), THREE("three"), DEFAULT("some value")
    //..
}

и класс Dto:

@JsonPropertyOrder(value = {"id", "name", "params"})
public Dto {
    private Long id;
    private String name;
    private Map<MyEnum, Object> params;
}

Как настроить порядок для ключей в параметрах карте? Я знаю, что LinkedHashMap можно использовать для настройки порядка и просто добавлять на карту в правильном порядке. Но! Существуют случаи, когда значение ключа должно быть добавлено во время выполнения и добавлено в params сопоставление не с последней ссылкой, а внутри карты. например,

params = new LinkedHashMap();
params.put(ONE, new String("object1"));
params.put(THREE, new String("object #3"));

и чем в другом месте кода мы только что добавили

params.put(TWO, new Integer(20));

и порядок внутри json должен быть:

{
 "id":"123", "name":"some name", 
"params":{"ONE":"object1","TWO":"20","THREE":"object #3"}
 }

1 Ответ

0 голосов
/ 31 октября 2018

Я могу предложить два варианта, которые основаны на том факте, что Джексон использует MapSerializer для сериализации объектов типа Map.

Во-первых, поскольку enum типы определяют неявный естественный порядок, основанный на их порядке объявления, вы можете включить свои ObjectMapper SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS. Javadoc заявляет,

Функция, определяющая, будут ли java.util.Map записи отсортированы первыми по ключу до сериализации или нет: если включена, дополнительная сортировка шаг выполняется при необходимости (не обязательно для java.util.SortedMap s), если отключено, дополнительная сортировка не требуется.

Другими словами, перечисления в вашей карте params сначала будут отсортированы по порядку их объявления, а затем сериализованы. Обратите внимание, что эта функция сериализации применяется ко всем картам.

Во-вторых, вы можете инициализировать params как EnumMap. Для сериализации Map, MapSerializer итерирует карту entrySet(). Набор записей, возвращаемый EnumMap#entrySet(), упорядочен по порядку объявления констант в соответствующем типе enum. Вы бы

params = new EnumMap<>(MyEnum.class);
params.put(THREE, new String("object #3"));
params.put(ONE, new String("object1"));
// whatever order

и Джексон будет сериализовать их в порядке объявления констант перечисления.

...