使用 Snake Yaml 的必填字段缺少双引号

Missing double quotes for the required field using Snake Yaml

我正在尝试读取 Yaml 模板并动态替换模板中的某些字段并创建一个新的 Yaml 文件。我生成的 yaml 文件应该在所有方面反映模板,包括双引号。但是当我使用 snake 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

我的问题是,我在新 yaml 文件中缺少 "id" 节点的双引号。 当我使用 options.setDefaultScalarStyle(ScalarStyle.DOUBLE_QUOTED) 时,我将所有字段都用双引号括起来,这不是必需的。我只需要 id 字段的双引号。 谁能请教解决这个问题的建议。

谢谢

如果您的输入是模板,使用模板引擎可能会更好。作为一个简单的例子,MessageFormat 将允许您编写 id: "{0}" 然后将实际值插入其中,保留双引号。您可以根据您的用例使用更复杂的模板。


话虽如此,让我们看看如何使用 SnakeYAML 来实现:

如果您想控制单个项目如何呈现为标量,您必须像这样定义 class:

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);
        }
    }
}

修改您的代码以使用新的 class:

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

最后,指示 SnakeYAML 使用您的代表:

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

这应该可以做到。