如何在NiFi中用JOLT处理器实现JSON对象转数组(避免重复转换)
Apache NiFi JOLT 转换规则实现方案
直接上能满足需求的JOLT转换规则:
[ { "operation": "shift", "spec": { "_source": { "users": { "attributes": { "organization": { // 如果organization下已有0键,直接保留整个organization结构 "0": { "@2": "_source.users.attributes.organization" }, // 如果没有0键,把当前的organization对象包装到0键下 "*": { "@1": "_source.users.attributes.organization.0.&" } } } } } } } ]
规则解释
- shift操作:负责JSON结构的重映射,是JOLT最常用的转换操作。
- 条件判断逻辑:
- 先检查
organization下是否存在0键:如果存在,就把整个organization节点(@2表示向上两层取原节点值)直接映射到目标路径,相当于保留原结构。 - 如果
organization下没有0键,说明是单个对象结构,此时*会匹配单个对象里的所有字段(比如display、objectGUID),然后通过@1取这些字段所在的父节点(也就是原单个organization对象),把它映射到organization.0路径下,完成包装。
- 先检查
测试验证
测试场景1:单个organization对象输入
输入JSON:
{ "_source": { "users": { "attributes": { "organization": { "display": "org1", "objectGUID": "7", "attributes": { "distinguishedName": "ou=org1,OU=BU" } } } } } }
转换后输出:
{ "_source": { "users": { "attributes": { "organization": { "0": { "display": "org1", "objectGUID": "7", "attributes": { "distinguishedName": "ou=org1,OU=BU" } } } } } } }
测试场景2:已有索引键的输入
输入JSON:
{ "_source": { "users": { "attributes": { "organization": { "0": { "display": "org1", "objectGUID": "7" }, "1": { "display": "org2", "objectGUID": "8" } } } } } }
转换后输出和原输入完全一致,保留了多索引的结构。
内容的提问来源于stack exchange,提问作者Vio
相关产品推荐
相关产品推荐

