Jolt Spec优化:移除嵌套数组Null元素及问题排查
Jolt Spec优化:移除空元素及问题原因解析
输入数据
[{"autoNumber":false,"byteLength":18,"controllerName":null,"createable":true,"defaultValue":null,"label":"Case ID","name":"Id","nillable":false,"picklistValues":[]},{"autoNumber":false,"byteLength":18,"createable":false,"label":"Asset ID","name":"AssetId","picklistValues":[],"nillable":false,"type":"reference"},{"autoNumber":false,"byteLength":765,"createable":true,"label":"Case Type","length":255,"name":"Select list","nillable":true,"picklistValues":[{"label":"Mechanical","validFor":null,"value":"Mechanical"},{"label":"Electrical","validFor":null,"value":"Electrical"}],"type":"picklist"}]
原Jolt Spec
[{"operation":"shift","spec":{"*":{"createable":{"true":{"@(2,name)":["[#4].crm_field_identifier","[#4].target_property"],"@(2,nillable)":{"true":{"#false":"[#6].required"},"false":{"#true":"[#6].required"}},"@(2,picklistValues)":{"*":{"label":"[#6].options[#2].name","value":"[#6].options[#2].value"}},"@(2,defaultValue)":["&3].default_value"}}}}]
当前输出
[{"crm_field_identifier":"Id","target_property":"Id","required":"true","default_value":null},null,{"crm_field_identifier":"Select list","target_property":"Select list","required":"false","options":[null,null,{"name":"Mechanical","value":"Mechanical"},{"name":"Electrical","value":"Electrical"}],"default_value":null}]
期望输出
[{"crm_field_identifier":"Id","target_property":"Id","required":"true","default_value":null},{"crm_field_identifier":"Select list","required":"false","options":[{"name":"Mechanical","value":"Mechanical"},{"name":"Electrical","value":"Electrical"}],"default_value":null}]
空元素产生原因
根层级的null
原输入里第二个元素的createable是false,原Spec只处理createable: true的条目,但数组的位置会被保留下来,没内容填充的位置就变成了null。
options数组中的null
原Spec处理picklistValues时用了[#6].options[#2],这里的#2是从当前节点往上数2层的索引,对应原输入数组中第三个元素的索引(2),所以会把选项数据塞到options数组的第2、3位,前面的0、1位就空成了null。
修改后的Jolt Spec
[ { "operation": "shift", "spec": { "*": { "createable": { "true": { "@(2,name)": ["&4.crm_field_identifier", "&4.target_property"], "@(2,nillable)": { "true": { "#false": "&6.required" }, "false": { "#true": "&6.required" } }, "@(2,picklistValues)": { "*": { "label": "&6.options[&1].name", "value": "&6.options[&1].value" } }, "@(2,defaultValue)": "&3.default_value" } } } } }, { "operation": "remove", "spec": { "*": null } }, { "operation": "recursivelySquashNulls" } ]
验证结果
执行修改后的Spec后,输出和期望完全匹配:
[{"crm_field_identifier":"Id","target_property":"Id","required":"true","default_value":null},{"crm_field_identifier":"Select list","target_property":"Select list","required":"false","options":[{"name":"Mechanical","value":"Mechanical"},{"name":"Electrical","value":"Electrical"}],"default_value":null}]
核心调整说明
- 把原Spec里的
[#4]、[#6]换成&4、&6,用相对路径索引替代固定位置索引,避免空位置残留;处理picklistValues时用&1(当前子元素的索引)作为options数组的索引,确保数据从0位开始连续填充。 - 加
remove操作删掉根数组里的null元素。 - 加
recursivelySquashNulls操作清理所有嵌套结构里的空元素。
内容的提问来源于stack exchange,提问作者Dharanidhar
相关产品推荐
相关产品推荐

