Файл YAML: чтение файла Yaml и запись файла в том же формате - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть файл Yaml в следующем формате:

соединитель:
Ключ1: тест
Ключ2: 22 * ​​1005 * Ключ3: имя_строки
Ключ4: TestingFucntion

Когда я пытаюсь прочитать файл и записать его в другой файл, формат отличается.Соединитель имени пакета: {ключ1: тест, ключ2: 22, ключ3: имя строки, ключ4: TestingFucntion}

Ниже приведен код, который я использовал для чтения файла и его записи:

             Map<String, Object> data = new HashMap<String, Object>();
             data.put(key1, value1);
             DumperOptions options = new DumperOptions();            
             options.setIndent(4);
             options.setDefaultFlowStyle(DumperOptions.FlowStyle.AUTO);
             options.setPrettyFlow(true);
             Yaml yaml = new Yaml();
             InputStream in =  new FileInputStream(new File(FIle name));
             Prop cc = yaml.loadAs(in,Prop.class);
             cc.getconnector().setkey3(Strringname);
             Writer fwriter = new OutputStreamWriter(new FileOutputStream(File name), "UTF-8");
             yaml.dump(cc, fwriter); 

Любые предложения по записи файла в том же формате, в котором он находится.

1 Ответ

0 голосов
/ 24 сентября 2019

Используйте DumperOptions.FlowStyle.BLOCK вместо этого, если вы хотите иметь отображение в стиле блока.Вам также нужно сообщить конструктору Yaml о ваших options - сейчас они ничего не делают.

Чтобы удалить корневой тег и задать опции для Yaml, добавьте

final Representer representer = new Representer();
representer.addClassTag(Prop.class, Tag.MAP);
Yaml yaml = new Yaml(representer, options);

Устанавливает тег класса Prop в !!map, тег YAML по умолчанию для отображений.Это будет опущено, если вы не выводите его в каноническом стиле.


При этом важно отметить следующее: В общем, вы не можете гарантировать, что формат остается прежним ,SnakeYAML не поддерживает это, и технически это будет нарушением спецификации.Ключи всегда записываются в порядке, определенном вами в классе Prop, а не в том порядке, в котором они встречались в исходном файле.При десериализации удаляется такая информация, как пробелы, комментарии и другие подробности форматирования.

Если в ваших данных есть Map, порядок ключей будет произвольным (например, вы не можете определить или изменить его).Если исходный документ содержал ... или ---, эта информация будет потеряна.Если исходный документ содержал скаляры с '' или "", эта информация теряется.

Вы можете определить только согласованное поведение вывода (т.е. определить свои параметры и всегда использовать их), но если для ввода используетсядругой стиль, этот стиль всегда будет потерян.

...