Напишите буквальное поле YAML, используя новый YamlBuilder Groovy 3.0 - PullRequest
0 голосов
/ 25 февраля 2020

Groovy 3.0 имеет новый класс YamlBuilder, который работает аналогично существующему классу JsonBuilder.

Я пытаюсь понять, могу ли я использовать YamlBuilder для генерации литерального поля в YAML, например as:

data: |
  this is
  a literal
  text value

Моим первым предположением было бы то, что многострочная строка Groovy сработает:

new YamlBuilder() {
  data: '''\
this is
a literal
text value'''
}

Но это дает мне:

data: "this is\na literal\ntext value\n"`

Я не знаю Ничего полезного в YamlBuilder Javado c и примере * mrhaki не показано.

Кто-нибудь знает, если / как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Вы можете сделать следующее:

import groovy.yaml.*
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import static com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.LITERAL_BLOCK_STYLE

def yaml = new YamlBuilder()

yaml {
  data '''\
this is
a literal
text value'''
}

println new ObjectMapper(new YAMLFactory().configure(LITERAL_BLOCK_STYLE, true)).writeValueAsString(yaml)

Если вам нужна собственная пользовательская сериализация

2 голосов
/ 25 февраля 2020

Под прикрытием Groovy YamlBuilder использует конвертер Джексона JSON в YAML.

Конвертер Джексона поддерживает буквальный стиль блока, но его необходимо включить. Текущая версия YamlBuilder не поддерживает параметры настройки.

Я скопировал класс YamlBuilder и связанный класс YamlConverter, чтобы я мог изменить настройки.

В классе YamlBuilder я изменил этот метод:

public static String convertJsonToYaml(Reader jsonReader) {
    try (Reader reader = jsonReader) {
        JsonNode json = new ObjectMapper().readTree(reader);

        return new YAMLMapper().writeValueAsString(json);
    } catch (IOException e) {
        throw new YamlRuntimeException(e);
    }
}

Быть таким:

public static String convertJsonToYaml(Reader jsonReader) {
    try (Reader reader = jsonReader) {
        JsonNode json = new ObjectMapper().readTree(reader);

        YAMLMapper mapper = new YAMLMapper()
        mapper.configure(YAMLGenerator.Feature.LITERAL_BLOCK_STYLE, true)
        return mapper.writeValueAsString(json);
    } catch (IOException e) {
        throw new YamlRuntimeException(e);
    }
}

Это позволяет мне сделать:

mapper.configure(YAMLGenerator.Feature.LITERAL_BLOCK_STYLE, true)

, которая успешно отрендерит YAML в виде литерального блока:

data: |-
  this is
  a literal
  text value
...