如何通过Jolt仅拼接输入JSON中存在的extraFields字段?
Jolt处理可选字段的JSON字符串拼接问题
输入示例
{ "extraFields": { "language": "french", "status": { "comment": "hey" } } }
期望输出
{ "extraFields": "{\"language\": \"french\", \"status\": {\"comment\": \"hey\"}}" }
当前实现的Jolt公式
[ { "operation": "modify-overwrite-beta", "spec": { "extraFields": "=concat('{', '\"language\": ', '\"', @(0,language), '\" ,', '\"status\": ', '{', '\"comment\": ', '\"', @(1,extraFields.status.comment), '\"', '}', '}')" } } ]
问题点
当前公式硬编码了所有字段的拼接逻辑,一旦extraFields下的language或status字段缺失(或两者都缺失),会生成包含空值的无效JSON字符串,需要实现仅拼接实际存在的字段。
解决方案
通过分步生成字段片段、过滤空值、拼接字符串的方式,可以完美适配可选字段的场景,以下是可行的Jolt转换规则:
[ // 1. 为每个可选字段生成对应JSON片段,不存在则返回null { "operation": "modify-overwrite-beta", "spec": { "temp": { "language": "=ifElse(has(@(1,extraFields.language)), concat('\"language\": \"', @(1,extraFields.language), '\"'), null)", "status": "=ifElse(has(@(1,extraFields.status)), concat('\"status\": {\"comment\": \"', @(1,extraFields.status.comment), '\"}'), null)" } } }, // 2. 收集所有片段到数组 { "operation": "shift", "spec": { "temp": { "*": { "@": "fragments[]" } }, "extraFields": "@" } }, // 3. 过滤数组中的null值,只保留有效片段 { "operation": "modify-overwrite-beta", "spec": { "fragments": "=filterNull(@(1,fragments))" } }, // 4. 拼接有效片段为完整JSON字符串,空数组时生成{} { "operation": "modify-overwrite-beta", "spec": { "extraFields": "=concat('{', join(',', @(1,fragments)), '}')" } }, // 5. 清理临时字段 { "operation": "remove", "spec": { "temp": "", "fragments": "" } } ]
规则说明
- 生成片段:用
has()函数检查字段是否存在,存在则拼接符合JSON格式的键值对字符串,不存在则返回null - 过滤空值:通过
filterNull()函数移除数组中的null元素,确保只保留实际存在的字段片段 - 拼接字符串:用
join(',', ...)把有效片段用逗号分隔,再包裹大括号形成完整的JSON字符串;如果所有字段都缺失,会生成合法的空对象字符串{} - 清理临时字段:移除转换过程中产生的
temp和fragments临时字段,只保留目标字段extraFields
内容的提问来源于stack exchange,提问作者DoubleS
相关产品推荐
相关产品推荐

