如何在SnakeYaml的Loader/DumperOptions中使用setProcessComments()并实现注释往返?
SnakeYAML 保留注释的往返示例
实现逻辑
要完成带注释的YAML往返操作,核心是直接操作SnakeYAML的Node树结构——不要将YAML转成JavaBean或Map(这两种转换会丢失注释),同时在加载和转储环节都开启注释处理开关。
完整代码示例
import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.nodes.Node; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; public class YamlCommentRoundTrip { public static void main(String[] args) throws IOException { // 配置加载参数,开启注释处理 DumperOptions loadOpts = new DumperOptions(); loadOpts.setProcessComments(true); Yaml yamlLoader = new Yaml(loadOpts); // 加载YAML文件为Node树(保留注释) try (FileInputStream fis = new FileInputStream("input.yaml")) { Node rootNode = yamlLoader.compose(fis); // 配置转储参数,同样开启注释处理 DumperOptions dumpOpts = new DumperOptions(); dumpOpts.setProcessComments(true); // 可选:保持原文件的格式风格 dumpOpts.setIndent(2); dumpOpts.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); Yaml yamlDumper = new Yaml(dumpOpts); // 将Node树转储回文件,保留所有注释 try (FileWriter writer = new FileWriter("output.yaml")) { yamlDumper.dump(rootNode, writer); } } } }
关键细节说明
- 必须用
compose()方法加载YAML,而非load():load()会把Node树转换为普通Java对象(Map/Bean),注释信息会丢失;compose()直接保留原始的Node结构,包括所有注释节点。 - 加载和转储的
DumperOptions都要调用setProcessComments(true),缺省状态下注释不会被读取或输出。 - 如果需要修改YAML内容,直接操作
Node对象即可(比如修改MappingNode的键值对),注释会和对应节点绑定,修改后转储依然能保留。
测试用例
输入文件 input.yaml
# 全局配置注释 app: name: DemoApp # 应用名称说明 version: 2.1.0 # 文件末尾注释
运行代码后,输出文件output.yaml会和输入完全一致,所有注释都被完整保留。
内容的提问来源于stack exchange,提问作者robross0606
相关产品推荐
相关产品推荐

