NiFi:JoltTransformJSON 规范

NiFi: JoltTransformJSON specification

我关注JSON:

{
  "results": [
    {
      "customerClient": {
        "resourceName": "customers/7876562723/customerClients/8506630423",
        "clientCustomer": "customers/8506630423",
        "hidden": false,
        "level": "1",
        "manager": false,
        "descriptiveName": "BMW",
        "id": "85061423"
      }
    },
    {
      "customerClient": {
        "resourceName": "customers/7876562723/customerClients/6736523142",
        "clientCustomer": "customers/6736523142",
        "hidden": false,
        "level": "1",
        "manager": true,
        "descriptiveName": "Mercedes",
        "id": "67363142"
      }
    }
}
  ],
  "fieldMask": "customerClient.clientCustomer,customerClient.hidden,customerClient.level,customerClient.descriptiveName,customerClient.id,customerClient.manager"
}

我想要的:

  1. 删除 fieldMask 参数,因此我不需要结果作为数组。
  2. 删除 resultscustomerCient。 所以我的 JSON 应该是这样的:
{
   "resourceName": "customers/7876562723/customerClients/8506630423",
   "clientCustomer": "customers/8506630423",
   "hidden": false,
   "level": "1",
   "manager": false,
   "descriptiveName": "BMW",
   "id": "85061423"
},
{
   "resourceName": "customers/7876562723/customerClients/6736523142",
   "clientCustomer": "customers/6736523142",
   "hidden": false,
   "level": "1",
   "manager": true,
   "descriptiveName": "Mercedes",
   "id": "67363142"
}

要删除 results,我正在使用 SplitJson,拆分值:$.results。现在我坚持使用 JOLT 规范修改它。 如何仅使用 JoltTransformJSON 执行上述操作?

首先 - 你 json 是错误的,你有一个额外的 }.

没有使用 jolt

1 - 生成数据

2 - 以 $.results.[*].customerClient 作为属性 results

评估 json

3 - 将文本替换为 ${results:replace(']',''):replace('[','')}

这会给你

{
    "resourceName": "customers/7876562723/customerClients/8506630423",
    "clientCustomer": "customers/8506630423",
    "hidden": false,
    "level": "1",
    "manager": false,
    "descriptiveName": "BMW",
    "id": "85061423"
},
{
    "resourceName": "customers/7876562723/customerClients/6736523142",
    "clientCustomer": "customers/6736523142",
    "hidden": false,
    "level": "1",
    "manager": true,
    "descriptiveName": "Mercedes",
    "id": "67363142"
}

好的,所以我相信 JOLT 只能输出一个对象,因此在一个 JOLT 中不可能将数组的每个元素转换为唯一对象。但是,您可以在不将 FlowFile 数据放入属性的情况下完成大部分工作。

我们可以:

  • 删除fieldMask
  • 删除results数组级别

使用它来测试 JOLT:https://jolt-demo.appspot.com/#inception

假设您的 JSON 实际上是有效的,那么:

{
  "results": [
    {
      "customerClient": {
        "resourceName": "customers/7876562723/customerClients/8506630423",
        "clientCustomer": "customers/8506630423",
        "hidden": false,
        "level": "1",
        "manager": false,
        "descriptiveName": "BMW",
        "id": "85061423"
      }
    },
    {
      "customerClient": {
        "resourceName": "customers/7876562723/customerClients/6736523142",
        "clientCustomer": "customers/6736523142",
        "hidden": false,
        "level": "1",
        "manager": true,
        "descriptiveName": "Mercedes",
        "id": "67363142"
      }
    }
  ],
  "fieldMask": "customerClient.clientCustomer,customerClient.hidden,customerClient.level,customerClient.descriptiveName,customerClient.id,customerClient.manager"
}

您可以使用这个 JOLT 规范:

[
  {
    "operation": "remove",
    "spec": {
      "fieldMask": ""
    }
  },
  {
    "operation": "shift",
    "spec": {
      "results": {
        "*": {
          "customerClient": "customerClient-&1"
        }
      }
    }
  }
]

结果如下:

{
  "customerClient-0" : {
    "resourceName" : "customers/7876562723/customerClients/8506630423",
    "clientCustomer" : "customers/8506630423",
    "hidden" : false,
    "level" : "1",
    "manager" : false,
    "descriptiveName" : "BMW",
    "id" : "85061423"
  },
  "customerClient-1" : {
    "resourceName" : "customers/7876562723/customerClients/6736523142",
    "clientCustomer" : "customers/6736523142",
    "hidden" : false,
    "level" : "1",
    "manager" : true,
    "descriptiveName" : "Mercedes",
    "id" : "67363142"
  }
}

因此您可以仅使用 JOLT 将 JSON 转换为平面结构,然后您可以使用 SplitJSON 分解每个对象(如果需要)。

您应该考虑使用 Records 而不是 SplitJSON,这样效率可能更高。

阅读记录:

另一个有趣的选择可能是 ScriptedTransformRecord