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

NiFi使用AttributesToJSON无法生成数组格式JSON的问题咨询

解决NiFi中AttributesToJSON输出数组为字符串的问题

这是个典型的NiFi属性处理场景问题,核心原因在于NiFi的所有属性值本质都是字符串类型:当你用EvaluateJsonPath把数组提取到myArray属性时,数组会被序列化为带方括号的字符串(比如"[1,2,3,4]"),而AttributesToJSON默认会把所有属性值当作普通字符串处理,自然会给它加上引号,导致最终输出的JSON里数组变成了字符串包裹的形式。

下面给你两种可行的解决方案:

方案一:用JoltTransformJSON将字符串转成数组

这是最简洁的原生处理器方案,步骤如下:

  • 在AttributesToJSON处理器之后添加一个JoltTransformJSON处理器
  • 配置Jolt的规范为Modify Overwrite Beta操作,利用jsonParse函数将字符串解析为JSON数组:
    {
      "operation": "modify-overwrite-beta",
      "spec": {
        "myArray": "=jsonParse"
      }
    }
    
  • 运行流程后,JoltTransformJSON会把"[1,2,3,4]"字符串解析成真正的JSON数组,最终输出就是你期望的:
    {"myArray":[1,2,3,4]}
    

方案二:用ExecuteScript直接生成目标JSON

如果你偏好更灵活的脚本处理,可以用ExecuteScript处理器(推荐用Groovy,性能更优)直接读取属性并生成正确的JSON:

  • 添加ExecuteScript处理器,选择Groovy作为脚本语言
  • 替换默认脚本为以下内容:
    def flowFile = session.get()
    if (!flowFile) return
    
    // 读取属性并解析为数组
    def myArray = new groovy.json.JsonSlurper().parseText(flowFile.getAttribute('myArray'))
    // 构建目标JSON
    def outputJson = new groovy.json.JsonBuilder([myArray: myArray]).toString()
    
    // 写入FlowFile内容
    flowFile = session.write(flowFile, { outputStream ->
        outputStream.write(outputJson.getBytes('UTF-8'))
    } as OutputStreamCallback)
    
    session.transfer(flowFile, REL_SUCCESS)
    
  • 这个脚本会直接把属性里的字符串数组解析为JSON数组,然后生成符合要求的JSON内容,跳过AttributesToJSON的中间步骤。

额外提示:避免不必要的属性转换

如果你的场景允许,其实可以跳过把数组放到属性的步骤——直接用EvaluateJsonPath处理器设置Destination为flowfile-content,提取myArray对应的JSON结构,再结合其他处理器(比如JoltTransformJSON)来构建最终的JSON对象,这样能避免属性字符串化带来的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:34