如何在K8s Helm模板中通过.Files将YAML转为JSON?
问题:Helm模板中通过.Files将YAML文件转为JSON格式
问题场景
需要在Helm模板中通过.Files读取YAML文件并转为JSON格式,但当前实现得到的是字符串转义后的结果,而非解析后的结构化JSON。
当前ConfigMap模板
apiVersion: v1 kind: ConfigMap metadata: name: my-config-file data: sounds.json: |- {{ .Files.Get "file/sounds.yaml" | toPrettyJson | indent 4 }}
对应的file/sounds.yaml内容
animal: dog: sound: bark cat: sound: meow sheep: sound: baa
当前执行结果
执行helm template release-name chart-name后输出:
apiVersion: v1 kind: ConfigMap metadata: name: my-config-file data: sounds.json: |- "animal:\n dog:\n sound: bark\n cat:\n sound: meow\n sheep:\n sound: baa\n"
期望输出
apiVersion: v1 kind: ConfigMap metadata: name: my-config-value data: sounds.json: |- { "animal": { "cat": { "sound": "meow" }, "dog": { "sound": "bark" }, "sheep": { "sound": "baa" } } }
解决方案
问题根源是.Files.Get直接返回YAML字符串,toPrettyJson仅将该字符串转为JSON格式的字符串,而非解析YAML结构后转JSON。需先通过fromYaml函数解析YAML字符串为结构化数据,再转JSON。
修正后的模板:
apiVersion: v1 kind: ConfigMap metadata: name: my-config-file data: sounds.json: |- {{ .Files.Get "file/sounds.yaml" | fromYaml | toPrettyJson | indent 4 }}
步骤解释
.Files.Get "file/sounds.yaml":读取目标YAML文件,返回字符串内容fromYaml:将YAML字符串解析为Helm模板可处理的结构化数据(map/数组)toPrettyJson:把结构化数据转为格式化后的JSON字符串indent 4:为生成的JSON内容添加4空格缩进,匹配ConfigMap的格式要求
执行修正后的模板即可得到预期的结构化JSON结果。
内容的提问来源于stack exchange,提问作者Mohammad Faisal
相关产品推荐
相关产品推荐

