You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}]

核心调整说明

  1. 把原Spec里的[#4]、[#6]换成&4、&6,用相对路径索引替代固定位置索引,避免空位置残留;处理picklistValues时用&1(当前子元素的索引)作为options数组的索引,确保数据从0位开始连续填充。
  2. 加remove操作删掉根数组里的null元素。
  3. 加recursivelySquashNulls操作清理所有嵌套结构里的空元素。

内容的提问来源于stack exchange,提问作者Dharanidhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:49:54