Разобрать Enum по значению с помощью SnakeYAML

Как указано в документах и видно из исходный код, SnakeYAML работает с перечислениями по их именам. Что я хотел бы иметь, так это анализировать значения по значению перечисления, например:

перечисление:

public enum Strategy {
    ALWAYS_RUN("always-run"),
    ALWAYS_SKIP("always-skip"),
    DEPENDS("depends");
    ...
}

YAML:

branches:
  trunk: always-skip
  bugfix: depends
  default: always-run

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


person Actine    schedule 01.08.2014    source источник


Ответы (2)


Насколько мне известно, это невозможно. Константы Enum являются закрытыми и, следовательно, недоступны для других классов, поэтому синтаксический анализатор YAML не сможет создавать объекты.

Хотя это и не идеально, вы можете использовать псевдонимы, чтобы создать псевдоним для перечислений. .

person Ben Green    schedule 01.08.2014
comment
Хм, интересная концепция. Что ж, для перечислений есть метод valueOf, который можно было бы использовать, если бы только SnakeYAML имел эту внутреннюю обработку. - person Actine; 01.08.2014
comment
Я искал вас, чтобы узнать, можете ли вы включить файл yaml в другой файл yaml, поэтому определите все псевдонимы в yaml, а затем просто включите его во все остальные, чтобы скрыть псевдонимы. К сожалению, это невозможно :( Я думаю, вам просто придется справиться с прописными буквами в вашем yaml. - person Ben Green; 01.08.2014
comment
или просто проанализируйте их как строки и, возможно, выполните преобразование в перечисления в коде - person Actine; 01.08.2014
comment
Я тоже собирался предложить это. Просто сохраните их как строки, а затем преобразуйте их в перечисления в java-объекте :) - person Ben Green; 01.08.2014
comment
Мне также было интересно, можно ли заставить змею использовать метод, отличный от valueOf(...), но потом я нашел эту статью: groups.google.com/forum/#!topic/snakeyaml-core/iNMU_9nH90s Похоже, это практически невозможно. Но да, если вы хотите сохранить его в нижнем регистре, я бы сохранил их как строки, а затем проанализировал их при загрузке. - person Ben Green; 01.08.2014

Есть еще один способ сделать это. Возможно, он не чистый, но работает правильно.

  1. Создайте новый класс Constructor, расширив org.yaml.snakeyaml.constructor.Constructor.
  2. Внутри него создайте ScalarConstuctor protected class с той же реализацией кода, что и в базовом классе ScalarConstructor, за исключением реализации разбора перечисления.
  3. В методе constructStandardJavaInstance проверьте, существует ли enum с именем в верхнем или нижнем регистре.
  4. Наконец, создайте объект Yaml с помощью конструктора (шаг 1)
person treekt    schedule 05.01.2021
comment
Для потомков... Я создал форк из вышестоящего репозитория snapyaml и добавил возможность настройки чувствительности к регистру - github.com/asomov/snakeyaml/pull/14. Жду одобрения пулреквеста и добавляю его в ветку master - person treekt; 07.01.2021
comment
Мой запрос на включение был принят. Он будет поставляться в версии 1.28. - person treekt; 19.01.2021