Отсутствие двойных кавычек для обязательного поля с использованием Snake Yaml - PullRequest
1 голос
/ 03 марта 2020

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

Пример:

Мой шаблон yaml выглядит так:

version: snapshot-01
kind: sample
metadata:
  name: abc
groups:
  id: "1000B"
  category: category1

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

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

Теперь я заменяю обязательные поля, как показано ниже

 yamlMap.put("version","v-1.0");
 Map<String, Object> metadata = (Map<String, Object>) yamlMap.get("metadata");
 metadata.put("name", "XYZ");

 Map<String, Object> groups = (Map<String, Object>) yamlMap.get("groups");
 groups.put("id","5000Z");
 groups.put("category","newCategory");

        DumperOptions options = new DumperOptions();
        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        options.setPrettyFlow(true);

        Yaml yaml = new Yaml(options);
        String output = yaml.dump(map);
        System.out.println(output);

Я ожидаю вывод, как показано ниже

Ожидаемый результат:

version: v-1.0
kind: sample
metadata:
  name: XYZ
groups:
  id: "5000Z"
  category: newCategory

Но на самом деле я получаю вывод, как показано ниже

version: v-1.0
kind: sample
metadata:
  name: XYZ
groups:
  id: 5000Z
  category: newCategory

Моя проблема в том, что мне не хватает двойных кавычек для "id" узел в новом файле yaml. Когда я использую, options.setDefaultScalarStyle (ScalarStyle.DOUBLE_QUOTED), я получаю все поля в двойных кавычках, что не требуется. Мне нужны двойные кавычки только для поля id. Может кто-нибудь, пожалуйста, совет для решения этой проблемы.

Спасибо

1 Ответ

1 голос
/ 03 марта 2020

Если вы используете шаблон, возможно, лучше использовать шаблонизатор. В качестве простого примера, MessageFormat позволит вам написать id: "{0}" и затем вставить в него фактическое значение, сохраняя двойные кавычки. Вы можете использовать более сложные шаблоны в зависимости от вашего варианта использования.


При этом давайте посмотрим, как это сделать с SnakeYAML:

Если вы хотите контролировать, как один Элемент отображается как скаляр, вы должны определить класс следующим образом:

class QuotedString {
    public String value;

    public QuotedString(String value) {
        this.value = value;
    }
}

, а затем создать для него собственный представитель:

class MyRepresenter extends Representer {
    public MyRepresenter() {
        this.representers.put(QuotedString.class, new RepresentQuotedString());
    }

    private class RepresentQuotedString implements Represent {
        public Node representData(Object data) {
            QuotedString str = (QuotedString) data;
            return representScalar(
                    Tag.STR, str.value, DumperOptions.ScalarStyle.DOUBLE_QUOTED);
        }
    }
}

Измените код, чтобы использовать новый класс :

groups.put("id", new QuotedString("5000Z"));

И наконец, проинструктируйте SnakeYAML использовать ваш представитель:

Yaml yaml = new Yaml(new MyRepresenter(), options);

Это должно сделать это.

...