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"
}
我想要的:
- 删除
fieldMask
参数,因此我不需要结果作为数组。
- 删除
results
和 customerCient
。
所以我的 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,这样效率可能更高。
阅读记录:
- https://blogs.apache.org/nifi/entry/record-oriented-data-with-nifi
- https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.12.1/org.apache.nifi.processors.standard.UpdateRecord/index.html
- https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-record-serialization-services-nar/1.12.1/org.apache.nifi.json.JsonTreeReader/index.html
另一个有趣的选择可能是 ScriptedTransformRecord
我关注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"
}
我想要的:
- 删除
fieldMask
参数,因此我不需要结果作为数组。 - 删除
results
和customerCient
。 所以我的 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
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,这样效率可能更高。
阅读记录:
- https://blogs.apache.org/nifi/entry/record-oriented-data-with-nifi
- https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.12.1/org.apache.nifi.processors.standard.UpdateRecord/index.html
- https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-record-serialization-services-nar/1.12.1/org.apache.nifi.json.JsonTreeReader/index.html
另一个有趣的选择可能是 ScriptedTransformRecord