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

如何在Apache NiFi中提取JSON动态键并验证对应内容

在Apache NiFi中提取JSON动态键并验证数组非空

方案选择

优先推荐JoltTransformJSON + UpdateAttribute的无代码组合,适合快速配置;如果需要更灵活的逻辑,用ExecuteScript写脚本处理。


方案一:无代码配置(Jolt + UpdateAttribute)

1. 用Jolt转换JSON结构

通过Jolt规范把options下的动态键值对转成可处理的数组,同时过滤非空数组:

[
  {
    "operation": "shift",
    "spec": {
      "values": {
        "Reasons": {
          "options": {
            "*": {
              "$": "option_ids[]",
              "@": "option_arrays[]"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "non_empty_ids": "=filter(option_ids, option_arrays[&] != [])"
    }
  }
]

转换后会生成三个字段:

  • option_ids:所有动态ID的数组(如["9876","9875","9874"])
  • option_arrays:对应ID的数组列表
  • non_empty_ids:仅保留对应数组非空的ID

2. 用UpdateAttribute存入变量

在UpdateAttribute处理器中,用表达式把结果转为属性变量:

  • 提取所有ID:all_option_ids = ${option_ids:join(',')}
  • 提取非空ID:non_empty_option_ids = ${non_empty_ids:join(',')}

方案二:Groovy脚本处理(ExecuteScript)

如果需要自定义逻辑,用Groovy脚本直接解析JSON并提取结果:

import groovy.json.JsonSlurper

def flowFile = session.get()
if (!flowFile) return

def json = new JsonSlurper().parseText(flowFile.read().getText('UTF-8'))
def optionsMap = json.values.Reasons.options

// 提取所有动态ID
def allIds = optionsMap.keySet().toList()
// 过滤出对应数组非空的ID
def nonEmptyIds = allIds.findAll { id -> optionsMap[id]?.size() > 0 }

// 存入NiFi属性
flowFile = session.putAttribute(flowFile, 'all_option_ids', allIds.join(','))
flowFile = session.putAttribute(flowFile, 'non_empty_option_ids', nonEmptyIds.join(','))

session.transfer(flowFile, REL_SUCCESS)

脚本执行后,all_option_ids和non_empty_option_ids会作为属性附加在FlowFile上,后续处理器可直接调用。


验证逻辑说明

  • 空数组判断:NiFi表达式用isEmpty()方法,脚本中用size() > 0校验
  • 动态键匹配:Jolt用*通配符匹配所有不确定键名,脚本用keySet()直接获取所有键

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:55:02