基于双条件替换扁平化JSON中的值(Jolt实现)
Jolt扁平化JSON的条件替换解决方案
需求:针对扁平化后的JSON,当同一索引下的values_*_identifier等于"colour"且values_*_value等于"green"时,将"green"替换为"gre",需满足AND逻辑且保证索引一致。
输入JSON:
{ "values_0_identifier": "country", "values_0_value": "red", "values_0_value_unit_key": "", "values_0_language": "", "values_1_identifier": "metal", "values_1_value": "red", "values_1_value_unit_key": "", "values_1_language": "", "values_2_identifier": "colour", "values_2_value": "green", "values_2_value_unit_key": "", "values_2_language": "" }
期望输出:
{ "values_0_identifier": "country", "values_0_value": "red", "values_0_value_unit_key": "", "values_0_language": "", "values_1_identifier": "metal", "values_1_value": "red", "values_1_value_unit_key": "", "values_1_language": "", "values_2_identifier": "colour", "values_2_value": "gre", "values_2_value_unit_key": "", "values_2_language": "" }
你尝试的Spec存在两个问题:
- 条件判断逻辑错误,导致目标值被吞没
- 无法通过通配符匹配同一索引,只能指定具体数字
解决方案
采用三步Jolt操作实现需求:
- 将同一索引的字段分组,方便条件判断
- 对分组后的字段进行AND条件判断,替换目标值
- 将分组后的结构重新扁平化回原格式
完整Jolt Spec:
[ // 第一步:按索引分组字段 { "operation": "shift", "spec": { "values_*_*": { "$(0,1)": { "$(0,2)": "&1_&2" } } } }, // 第二步:条件判断并替换value { "operation": "modify-overwrite-beta", "spec": { "*": { "value": { "$": "=and(equals(@(1,identifier), 'colour'), equals(@, 'green'))", "true": "#gre", "*": "@" } } } }, // 第三步:重新扁平化回原键格式 { "operation": "shift", "spec": { "*": { "*": "values_&1_&" } } } ]
说明
- 第一步
shift操作:通过通配符values_*_*捕获索引数字和字段类型(如identifier/value),将同一索引的字段归组到以索引数字命名的对象下,解决了索引匹配的问题。 - 第二步
modify-overwrite-beta操作:使用=and()实现AND逻辑判断,当当前索引下的identifier为"colour"且value为"green"时,将value替换为"gre";否则保留原value。 - 第三步
shift操作:将分组后的结构重新转换为原扁平化格式,保证输出键的命名规则与输入完全一致。
内容的提问来源于stack exchange,提问作者Katja Bürger
相关产品推荐
相关产品推荐

