如何使用jq递归将JSON所有属性名首字母转为大写?
递归将JSON所有属性名首字母转为大写的jq实现
直接用递归函数就能搞定全层级的属性名转换,以下是完整的jq命令:
jq 'def capitalize_key: if type == "object" then to_entries | map( .key = (.key[0:1] | ascii_upcase) + .key[1:] | .value |= capitalize_key ) | from_entries elif type == "array" then map(capitalize_key) else . end; capitalize_key' x.json
命令拆解
- 先定义了一个叫
capitalize_key的递归函数,根据JSON值的类型做不同处理:- 对象类型:
to_entries把对象转成键值对数组(比如{"a":1}变成[{"key":"a","value":1}])- 遍历每个键值对:把键的首字母转大写,同时递归处理值(如果值是嵌套对象或数组,会继续深入处理)
from_entries把处理后的键值对数组转回对象
- 数组类型:对数组里的每个元素递归调用函数,确保数组里的嵌套对象也能被处理,普通元素(比如字符串、数字)直接保留
- 其他类型(字符串、数字、布尔、null):直接返回原值,不做修改
- 对象类型:
验证示例
用你提供的输入测试:
输入JSON:
{ "field1": "v1", "field2": { "subfield1": "sv1" }, "field3": ["av1", "av2"] }
执行命令后输出:
{ "Field1": "v1", "Field2": { "Subfield1": "sv1" }, "Field3": ["av1", "av2"] }
完全符合你的期望,哪怕是更深层级的嵌套对象也能处理。
对比你原来的命令
你之前的命令只处理了第一层属性,而这个递归函数会自动遍历所有嵌套的对象,不用手动处理每一层,更简洁通用。
内容的提问来源于stack exchange,提问作者MurphyB
相关产品推荐
相关产品推荐

