Параметры Snake yaml dumper, генерирующие ненужный символ escape-пробелов ("\") для строки с пробелами при преобразовании из карты в yaml - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь прочитать шаблон Yaml и динамически заменить определенные поля в шаблоне и создать новый файл Yaml с помощью Snake Yaml. Но я получаю escape-символ пробела, если строка содержит пробелы для обязательных полей, когда я использую snake yaml. Может ли кто-нибудь предложить решение этой проблемы?

У меня возникает еще одна проблема с преобразованием карты в yaml с пробелами.

Пример:

--------------------------------
version: snapshot-01
kind: sample
metadata:
  name: abc
options: "<placeholder>"
--------------------------------

Я читаю выше шаблона и динамически заменяя обязательные поля, как показано ниже.

 Yaml yaml = new Yaml();
 InputStream inputStream = 
 this.getClass().getClassLoader().getResourceAsStream(yamlTemplateLocation);
 Map<String, Object>yamlMap = yaml.load(inputStream);

Когда я заменяю заполнители строкой, содержащей пробелы Пример: "ab c sfksajfkl jfajfkjakj jqjlkkalkl kajklfjalkd"

yamlMap.put("version","v-1.0");
yamlMap.put("options","abc sfksajfkl jfajfkjakj jqjlkkalkl kajklfjalkd");

Я получаю вывод как

--------------------------------
version: "v-1.0"
kind: sample
metadata:
  name: abc
options:  "abc  sfksajfkl  jfajfkjakj  
      \ jqjlkkalkl  kajklfjalkd "
--------------------------------

Примечание. Он генерирует escape-символ пробела (т.е. «\») в «ab c sfksajfkl jfajfkjakj \ jqjlkkalkl kajklfjalkd»

Но мое требование такое, как показано ниже - которое не должно генерировать символ escape-пробела

--------------------------------
version: "v-1.0"
kind: sample
metadata:
  name: abc
options:  "abc  sfksajfkl  jfajfkjakj  jqjlkkalkl  kajklfjalkd"
--------------------------------

Может ли кто-нибудь помочь мне с этим? Заранее спасибо!

1 Ответ

0 голосов
/ 27 мая 2020

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

escape-символ - это просто побочный эффект разрыва строки. При разбиении скаляра в кавычках на несколько строк разрывы строк складываются в одиночные пробелы. Однако у вас есть несколько пробелов между словами, поэтому YAML должен вставить экранированный пробел, чтобы пометить второй пробел как содержимое (все неэкранированные пробелы в начале второй строки считаются отступом, а не частью содержимого).

Итак, актуальная проблема, которую вам нужно решить, - это разрыв строки. Вы отключаете его следующим образом:

DumperOptions options = new DumperOptions();
options.setSplitLines(false);
Yaml yaml = new Yaml(options);
System.out.println(yaml.dump(yamlMap));

В качестве примечания, YAML с разрывами строк и экранированным пробелом загружается правильно. Старайтесь не предъявлять слишком специфических c требований к представлению YAML, поскольку вы не можете полностью его контролировать.

...