如何用Helm Go Template合并JSON文件生成合法ConfigMap
Fixing Trailing Comma in JSON ConfigMap Generated by Helm Templates
Helm模板里遍历生成JSON时,最后一项多出逗号破坏语法是个挺常见的坑。我之前处理过类似需求,要把多个JSON文件合并成ConfigMap里的一个JSON映射,同时避免trailing comma,下面是经过验证的可行方案:
data: appdata: |- { {{- $candidates := .Files.Glob "data/json/*.json" -}} {{- $valuesJson := toJson $candidates -}} {{- $filesMap := fromJson $valuesJson -}} {{- $outputMap := dict -}} {{- range $index, $filename := keys $filesMap -}} {{- $fileContents := $.Files.Get $filename -}} {{- $fileContentMap := fromJson $fileContents -}} {{- $contentName := pluck "name" $fileContentMap | first -}} {{- $_ := set $outputMap $filename $contentName -}} {{- end -}} {{- range $index, $filename := keys $outputMap -}} {{- if ne $index 0 -}} , {{- end -}} {{- pluck $filename $outputMap | first | printf "%q:" | nindent 6 -}} {{- $.Files.Get $filename | nindent 8 -}} {{- end }} }
关键逻辑说明:
- 核心逗号控制:第二次
range循环里的{{- if ne $index 0 -}} , {{- end -}}是解决问题的核心。通过判断循环索引$index是否为0(也就是是否是第一个元素),只在非第一个元素的前面输出逗号,完全避免了最后一项末尾出现多余逗号的问题。 - 文件内容预处理:第一次循环先把目标JSON文件的内容和对应字段提取出来,构建成我们需要的输出映射,方便后续统一处理格式,也预留了对文件内容做自定义调整的空间。
- 格式规范保障:使用
nindent控制每行缩进,保证生成的JSON结构整齐可读;|-标记确保appdata后的多行文本不会出现多余换行或空格问题,严格符合YAML和JSON的格式要求。
如果你的需求是直接把文件名作为JSON的key、文件完整内容作为value,也可以简化中间的映射构建步骤,直接在循环里处理,上面的方案保留了对文件内容字段的提取逻辑,完美适配你给出的示例场景。
内容的提问来源于stack exchange,提问作者Matt Gerrans
相关产品推荐
相关产品推荐

