Формат массивов объектов сериализации Jackson YAML - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь отформатировать сериализацию Jackson Yaml определенным образом.

employees:
 - name: John
   age: 26
 - name: Bill
   age: 17

Но когда я сериализую объект, это формат, который я получаю.

employees:
 -
  name: John
  age: 26
 -
  name: Bill
  age: 17
* 1006Есть ли способ избавиться от новой строки в начале объекта в массиве?Это чисто личные предпочтения / проблема читаемости.

Это свойства, которые я сейчас устанавливаю на YAMLFactory:

YAMLFactory yamlFactory = new YAMLFactory()
                .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES) //removes quotes from strings
                .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)//gets rid of -- at the start of the file.
                .enable(YAMLGenerator.Feature.INDENT_ARRAYS);// enables indentation.

Я посмотрел в документации по Java для YAMLGeneratorв Джексоне, и посмотрел на другие вопросы о стеке потока, но я не могу найти вариант, чтобы сделать то, что я пытаюсь сделать.

Я пробовал свойства CANONICAL_OUTPUT, SPLIT_LINES и LITERAL_BLOCK_STYLE, последнийустанавливается автоматически при установке MINIMIZE_QUOTES.CANONICAL_OUTPUT, кажется, добавляет скобки вокруг массивов.SPLIT_LINES и LITERAL_BLOCK_STYLE связаны с обработкой многострочных строк.

1 Ответ

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

Краткий ответ: в настоящее время нет способа сделать это через Джексона.Это связано с ошибкой в ​​snakeyaml, когда, если вы устанавливаете свойство IndicIndent, пробелы не обрабатываются должным образом, и поэтому snakeyaml добавляет новую строку.

Я нашел обходной путь, используя напрямую snakeyaml.

//The representer allows us to ignore null properties, and to leave off the class definitions
Representer representer = new Representer() {
    //ignore null properties
    @Override
    protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) {
        // if value of property is null, ignore it.
        if (propertyValue == null) {
            return null;
        }
        else {
            return super.representJavaBeanProperty(javaBean, property, propertyValue, customTag);
        }
    }

    //Don't print the class definition
    @Override
    protected MappingNode representJavaBean(Set<Property> properties, Object javaBean) {
        if (!classTags.containsKey(javaBean.getClass())){
            addClassTag(javaBean.getClass(), Tag.MAP);
           }

        return super.representJavaBean(properties, javaBean);
    }
};



DumperOptions dumperOptions = new DumperOptions();
//prints the yaml as nested blocks
dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
//indicatorIndent indents the '-' character for lists
dumperOptions.setIndicatorIndent(2);
//This is the workaround. Indent must be set to at least 2 higher than the indicator indent because of how whitespace is handled.
//If not set to 2 higher, then the newline is added.
dumperOptions.setIndent(4);
Yaml yaml = new Yaml(representer, dumperOptions);
//prints the object to a yaml string.
yaml.dump(object);

Обходной путь происходит с установкой свойства indent для DumperOptions.Вам нужно установить значение отступа как минимум на 2 больше, чем индикаторIndent, иначе будет добавлена ​​новая строка.Это связано с тем, как пробелы обрабатываются в snakeyaml.

...