在 YAML 配置设计中,针对"列表项存在基础形态和扩展形态"的常见场景,我们提供三种结构化方案及其处理逻辑:
方案一:全量映射格式(显式冗余)
ext:
- name: bcmath
option: [] # 显式声明空列表
- name: curl
option: []
- name: gd
option:
- with-freetype
- with-jpeg
- with-webp
处理优势:
- 数据结构完全统一,无需转换逻辑
- 可直接使用 yq '.ext' <<< "$yaml" 提取
适用场景:
强类型系统对接或需要严格数据校验的环境
方案二:智能省略格式(条件补全)
ext:
- name: bcmath # 省略空属性
- name: curl
- name: gd
option:
- with-freetype
- with-jpeg
- with-webp
数据查询:
yq '.ext | map(with( select( has("option") | not); .option=[] ))' <<< "$yaml"
实现原理:
通过空值检测自动补全默认属性,适合属性存在默认值的场景
方案三:混合结构格式(语法糖优化)
ext:
- bcmath # 字符串简写形式
- name: curl # 省略空属性
- name: gd # 完整映射形式
option:
- with-freetype
- with-jpeg
- with-webp
统一化处理命令:
yq '.ext | map(
with( select(type == "!!str"); . |= { "name": . } )
| .option |= ( . // [] )
)' <<< "$yaml"
核心优势:
在保持数据可读性的同时,极大减少样板代码
总结
混合结构格式兼容前两种模式,通过类型检测(!!str/!!map)和空值合并运算符(//)实现统一处理,最终输出标准数据结构。
评论0
暂时没有评论