Как загрузить несколько файлов yaml, используя Snake YAML Java? - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть несколько файлов yaml в каталоге.Как мне загрузить их все в один и тот же объект YAML (карта)?

# a.yaml
a: ValueA
c: ValueC

# b.yaml
a: ValueAA
b: ValueB

Я хочу a.yaml, а затем b.yaml.В результате получилось бы:

{ a: ValueAA, b: ValueB, c: ValueC }

Один из способов, которым я мог бы это сделать, - явное объединение содержимого a.yaml и b.yaml в одну строку, а затем загрузку объединенной строки.Я хотел бы знать, смогу ли я избежать этого и просто загрузить 2 файла yaml последовательно, используя API load ().

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Обратитесь к ответу Anthon для деталей.Как FYI для людей, которые хотят рабочий фрагмент, это то, что я сделал.

final Yaml yaml = new Yaml(configConstructor, representer);

try (
    final InputStream defaultYamlStream = new FileInputStream(settingsPath + "/cbench-default.yaml");
    final InputStream customerYamlStream = new FileInputStream(settingsPath + "/" + identifier + ".yaml");
    final InputStream fullYamlStream = new SequenceInputStream(defaultYamlStream, customerYamlStream);
) {
    //try
    parsedConfig = (BenchmarkConfig) yaml.load(fullYamlStream);

} catch (IOException ioe) {
    // ERROR
    System.out.println("Exception parsing the YAML configuration.");
    throw new RuntimeException("Exception parsing the YAML configuration.", ioe);
}

Я создаю поток объединенных файлов (в моем случае это поток последовательностей) и использую API загрузки в соответствии с рекомендациями Anthon, и он отлично работает.Запомните маркеры конца документа.

0 голосов
/ 17 декабря 2018

Я не знаю деталей SnakeYAML, но вы не можете просто объединить два файла a.yaml и b.yaml, даже если они оба имеют сопоставление на корневом уровне.При этом вы получите дубликат ключа в своем отображении, и в соответствии со спецификациями YAML 1.2 (и 1.0) вам не разрешено иметь дубликаты ключей, а спецификация 1.1 гласит, что вы должны получить предупреждение о дубликате ключа и первом значении(вы указываете, что хотите иметь второе).

Таким образом, вы должны решить эту проблему в Java, и вы можете сделать это, загрузив документы из соответствующих файлов и обновив структуру данных, загруженную из a.yaml, с помощьюодин из b.yaml.

Вы также можете объединить файлы в файл с несколькими документами, но для этого документы должны быть разделены указателем-указателем конца (---) илиИндикатор окончания документа (...).Обычно вам нужно использовать специальную функцию «загрузить все» для загрузки такого файла с несколькими документами, в результате чего получается список (или итератор) структур данных, загруженных из отображений, которые затем можно объединить.

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

...