使用snakeYaml向YAML文件添加嵌套contexts键值对问题求解
问题原因
- 写入模式错误:代码中使用
FileWriter(fileName, true)开启了追加写入模式,不会清空原有文件内容,修改后的内容直接拼到原文件末尾,导致原有contexts条目重复。 - 写入对象错误:存在
contexts节点的场景下,你只导出了contexts对应的列表对象写入文件,没有导出修改后的完整YAML结构,进一步加重了格式和内容错误。
修复方案
核心逻辑调整为:修改完整的YAML映射对象后,用覆盖模式一次性写入整个文件,避免追加和部分写入的问题。修复后完整代码如下:
import org.yaml.snakeyaml.DumperOptions import org.yaml.snakeyaml.Yaml import java.io.File import java.io.FileWriter import java.util.ArrayList import java.util.LinkedHashMap import java.util.List import java.util.Map DumperOptions options = new DumperOptions() options.setIndent( 2 ) options.setIndicatorIndent( 0 ) options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK) Yaml yaml = new Yaml(options) final String fileName = "/temp/rest.yaml" File myappFile = new File(fileName) Map<String, Object> myappMap = yaml.load(myappFile.text) as Map<String, Object> // 处理contexts节点 if (!myappMap.containsKey("contexts")) { Map<String, Object> btlContext = new LinkedHashMap<>() btlContext.put("version", "v2") btlContext.put("deprecated", "false") List<Map<String, Object>> contextList = new ArrayList<>() contextList.add(btlContext) myappMap.put("contexts", contextList) } else { boolean foundV2 = false List<Map<String, Object>> sourceContexts = myappMap.get("contexts") as List<Map<String, Object>> for (Map<String, Object> m : sourceContexts) { if ("v2".equals(m.get("version").toString())) { foundV2 = true break } } if (!foundV2) { Map<String, Object> btlContext = new LinkedHashMap<>() btlContext.put("version", "v2") btlContext.put("deprecated", "false") sourceContexts.add(btlContext) } } // 统一覆盖写入完整文件 FileWriter writer = new FileWriter(fileName, false) yaml.dump(myappMap, writer) writer.close()
验证说明
- 无
contexts节点场景:会直接在根节点下新增contexts字段和v2条目,格式符合预期。 - 已有
contexts节点场景:会在原有列表末尾追加v2条目,不会重复写入原有内容。 - 已存在v2条目场景:不会做任何修改,避免重复添加。
内容的提问来源于stack exchange,提问作者user3741611
相关产品推荐
相关产品推荐

