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

JOLT动态JSON键时间戳转Epoch:缺失字段报错原因咨询

问题原因

问题出在你写的JOLT Spec里——当FlowFile里没有assign、i_date这类指定字段时,NiFi表达式${assign:toDate(...)}找不到对应的字段值,直接触发表达式求值失败,导致JOLT组件报错。因为NiFi的表达式语言没法对不存在的字段执行toDate这类操作。

解决方案

修改JOLT Spec,给每个字段添加存在性判断,仅当字段存在时才执行时间转换,不存在则跳过该字段的处理。借助NiFi表达式语言的exists()和ifElse()函数就能实现:

修改后的Jolt Spec

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "assign": "${assign:exists():ifElse(${assign:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}",
      "updated_on": "${updated_on:exists():ifElse(${updated_on:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}",
      "i_date": "${i_date:exists():ifElse(${i_date:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}",
      "created_on": "${created_on:exists():ifElse(${created_on:toDate('yyyy-MM-dd HH:mm:ss'):toNumber()}, null)}"
    }
  },
  {
    "operation": "remove",
    "spec": {
      "*": "null"
    }
  }
]

逻辑说明

  1. 存在性校验:${field:exists():ifElse(转换逻辑, null)}会先检查字段是否存在,存在就执行时间转Epoch的操作,不存在则设为null
  2. 清理空字段:新增的remove操作会过滤掉所有值为null的字段,确保最终输出只包含原本存在且转换成功的时间字段,和你期望的结果一致。

测试验证

用你提供的输入JSON测试:

输入

{    
  "updated_on": "2023-03-14 03:56:22",
  "created_on": "2023-03-14 03:56:22"
}

输出

{
  "updated_on": 1678766182,
  "created_on": 1678766182
}

(如果需要Epoch时间为字符串类型,可在toNumber()后追加:toString(),即${field:toDate(...):toNumber():toString()})

补充方案(可选)

如果不想依赖JOLT的remove操作,也可以在EvaluateJsonPath组件里先提取所有存在的时间字段,再传递给JOLT处理,但上面的单JOLT组件方案更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:43:22