如何用Jolt转换将嵌套JSON的所有键转为小写?
Jolt转换:将所有JSON键转为小写(含嵌套键)
我有如下JSON输入:
{ "levelOne": [ { "leveltwo": { "levelThree": [ { "type": "typeOne", "leveltwo": { "Id": "101000094794", "Id2": "101000013207" } }, { "type": "typeTwo", "leveltwo": { "Id": "101000013207", "Id2": "101000013207" } } ] } } ] }
是否存在对应的Jolt转换规范,可将所有键(包括嵌套对象中的键,如leveltwo下的键)转为小写?目前我使用的Jolt模板如下:
[ { "operation": "shift", "spec": { "levelOne": { "*": { "leveltwo": { "id": "&3[&2].leveltwo.id", "levelThree": { "*": { "leveltwo": { "Id": "&6[&5].leveltwo.&3[&2].id", "Id2": "&6[&5].leveltwo.&3[&2].id2" }, "type": "&5[&4].leveltwo.&2[&1].type" } } } } } } }, { "operation": "shift", "spec": { "*": { "$": "&1.key", "@": "&1.value" } } }, { "operation": "modify-overwrite-beta", "spec": { "levelOne": { "key": "=toLower" } } }, { "operation": "shift", "spec": { "*": { "value": "@(1,key)" } } } ]
期望得到的结果是所有键(包括levelThree、typeOne、typeTwo)均为小写:
{ "levelone": [ { "leveltwo": { "levelthree": [ { "id": "101000094794", "id2": "101000013207", "type": "typeone" }, { "id": "101000013207", "id2": "101000013207", "type": "typetwo" } ] } } ] }
解决方案
可以通过递归遍历+键名转小写的方式实现,无需逐个指定键名。以下是完整的Jolt转换规范:
[ // 第一步:递归拆解所有键值对,分离键与值 { "operation": "shift", "spec": { "*": { // 处理数组元素 "*": { "$": "&2[&1].key", "@": "&2[&1].value", // 递归处理嵌套对象 "*": { "$": "&3[&2].&1.key", "@": "&3[&2].&1.value", "*": { "$": "&4[&3].&2.&1.key", "@": "&4[&3].&2.&1.value", "*": { "$": "&5[&4].&3.&2.&1.key", "@": "&5[&4].&3.&2.&1.value" } } } }, // 处理顶层对象键值 "$": "&1.key", "@": "&1.value", "*": { "$": "&2.&1.key", "@": "&2.&1.value", "*": { "$": "&3.&2.&1.key", "@": "&3.&2.&1.value" } } } } }, // 第二步:将所有key字段转为小写 { "operation": "modify-overwrite-beta", "spec": { "*": { "*": { "key": "=toLower", "*": { "key": "=toLower", "*": { "key": "=toLower", "*": { "key": "=toLower" } } } }, "key": "=toLower", "*": { "key": "=toLower", "*": { "key": "=toLower" } } } } }, // 第三步:用小写后的key重组JSON结构 { "operation": "shift", "spec": { "*": { "*": { "value": "@(1,key)", "*": { "value": "@(2,key).@(1,key)", "*": { "value": "@(3,key).@(2,key).@(1,key)", "*": { "value": "@(4,key).@(3,key).@(2,key).@(1,key)" } } } }, "value": "@(1,key)", "*": { "value": "@(2,key).@(1,key)", "*": { "value": "@(3,key).@(2,key).@(1,key)" } } } } }, // 第四步:将type字段的取值转为小写 { "operation": "modify-overwrite-beta", "spec": { "*": { "*": { "*": { "*": { "type": "=toLower" } } } } } } ]
说明:
- 递归拆解:通过多层shift操作,把每个嵌套层级的键和值拆分开,为修改键名做准备。
- 键名转小写:借助
modify-overwrite-beta和=toLower函数,批量将所有key字段转为小写。 - 重组结构:再次使用shift操作,用小写后的键名重新组装JSON,恢复原有的层级关系。
- 字段值转小写:单独处理
type字段的取值,转为小写以匹配期望输出。
内容的提问来源于stack exchange,提问作者Priyanka Koushal
相关产品推荐
相关产品推荐

