如何在Kubernetes ConfigMap的YAML中编写缩进JSON并转为单行存储
问题原因
YAML的折叠块标量(>-)规则是:将换行符替换为空格,但如果后续行的缩进比块的起始缩进更深,换行会被保留。你的buy.json所有行的缩进与块起始缩进一致,因此被折叠成单行;而sell.json的行缩进更深,所以保留了换行和缩进格式。
解决方案
方案1:纯原生YAML实现(推荐)
在>-后添加缩进级别数字,告诉YAML将所有超过该级别的缩进行统一折叠成单行。例如针对sell.json,将>-改为>2-(这里的2是块内容相对于父键sell.json的缩进数量):
apiVersion: v1 kind: ConfigMap metadata: name: transactions namespace: default data: buy.json: >- [ { "quanitity": 10, "price": 100, "name": "apple" }, { "quanitity": 20, "price": 200, "name": "banana" } ] sell.json: >2- [ { "quanitity": 8, "price": 105, "name": "apple" }, { "quanitity": 20, "price": 204, "name": "banana" } ]
应用后,sell.json会被自动转换为单行JSON字符串,同时YAML文件内的JSON仍保持缩进可读性。
方案2:Helm渲染(适合Helm管理场景)
如果用Helm管理K8s资源,可以在values.yaml中定义结构化的YAML数据,再通过toJson函数转换为单行JSON:
values.yaml
transactions: sellData: - quanitity: 8 price: 105 name: apple - quanitity: 20 price: 204 name: banana
ConfigMap模板
apiVersion: v1 kind: ConfigMap metadata: name: transactions namespace: default data: buy.json: >- [ { "quanitity": 10, "price": 100, "name": "apple" }, { "quanitity": 20, "price": 200, "name": "banana" } ] sell.json: {{ toJson .Values.transactions.sellData | quote }}
Helm渲染后会自动生成单行JSON,兼顾配置可读性和存储需求。
方案3:命令行快速生成
如果不需要保留YAML文件的多行格式,可通过jq将多行JSON转为单行后创建ConfigMap:
kubectl create configmap transactions \ --from-literal=buy.json='[{"quanitity":10,"price":100,"name":"apple"},{"quanitity":20,"price":200,"name":"banana"}]' \ --from-literal=sell.json="$(jq -c . << 'EOF' [ { "quanitity": 8, "price": 105, "name": "apple" }, { "quanitity": 20, "price": 204, "name": "banana" } ] EOF )"
内容的提问来源于stack exchange,提问作者nascarsayan
相关产品推荐
相关产品推荐

