JOLT规格适配修改:兼容Photos数组空值与多值场景
问题解决:兼容Photos数组空/单值/多值的JOLT规格调整
问题背景
现有JOLT规格在处理输入JSON的Photos数组多值时可正常转换,但当Photos数组为空时,第二个shift操作无法将card节点下的Id1、val等字段映射到输出的Photos数组,导致字段丢失。需要修改规格,同时兼容三种场景。
输入示例(Photos为空)
{"Entity":{"card":{"cardNo":"123456789","status":"10","cardAddress":"UK","cardAddress1":"US","cardCity":"mk","name":"RAM","lastName":"ABU","Id1":23452540,"val":"uu"},"Photos":[]}}
期望输出
{"tab":{"text":"123456789"},"address":[{"add":"UK","add2":"US","mk":"mk"}],"status":"10","Photos":[{"no":"23452540","caption2":"uu"}]}
原JOLT规格问题
原第二个shift操作仅能处理Photos下no/caption2为数组的情况(对应原Photos多值),当原Photos为空时,这两个字段是单个值,无法匹配到Photos.*.*的路径,导致Photos字段丢失。
修改后的JOLT规格
[ { "operation": "shift", "spec": { "Entity": { "card": { "cardNo": "tab.text", "status": "status", "cardAddress": "address[0].add", "cardAddress1": "address[0].add2", "cardC*": "address[0].mk", "Id1": "Photos.no", "val": "Photos.caption2", "bd2": "Photos.no", "bal": "Photos.caption2", "cf3": "Photos.no", "mal": "Photos.caption2", "lt4": "Photos.no", "tal": "Photos.caption2" }, "Photos": { "*": { "Id": "Photos.no", "Caption": "Photos.caption2" } } } } }, { "operation": "shift", "spec": { "tab": "&", "address": "&", "status": "&", "Photos": { "no": { "*": { "@": "&3[&1].no" }, "@": "&2[0].no" }, "caption2": { "*": { "@": "&3[&1].caption2" }, "@": "&2[0].caption2" } } } }, { "operation": "modify-overwrite-beta", "spec": { "Photos": { "*": { "no": "=toString" } } } } ]
修改说明
- 第一个shift操作:保持原有逻辑,完成基础字段映射,包括将原Photos数组元素的Id/Caption映射为Photos下的
no/caption2数组,以及card节点的Id1/val映射为Photos下的no/caption2单个值。 - 第二个shift操作:针对
no和caption2字段分别处理两种场景:- 若字段为数组(原Photos多值):遍历数组索引,将值映射到
Photos[索引].字段名,生成数组元素结构。 - 若字段为单个值(原Photos为空):将值直接映射到
Photos[0].字段名,把单个对象包装成数组。
- 若字段为数组(原Photos多值):遍历数组索引,将值映射到
- 第三个modify操作:保持原有逻辑,将Photos数组中每个元素的
no字段转为字符串类型。
此修改后,规格可兼容Photos数组为空、单值、多值的所有场景,生成符合要求的输出。
内容的提问来源于stack exchange,提问作者Philanthropic
相关产品推荐
相关产品推荐

