You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:54:03