问题描述
我正在尝试使用JOLT(使用NiFi JoltTransformJson处理器)将JSON转换为其他格式。对于单个JSON记录,正在使用的JOLT在JOLT应用程序演示中工作正常,而如果我执行多个JSON记录,则在JOLT应用程序演示中无法获得预期的输出。任何人都可以纠正我在JOLT规范中需要进行哪些其他更改才能处理多个JSON记录。
示例输入json
[
{
"pool": {
"field": [
{
"name": "BillingDay","value": "12"
},{
"name": "Custom1","value": "POOL_BASE_PLAN_3GB"
}
]
},"usage": {
"version": "3","quota": {
"name": "POOL_TOP_UP_1GB_2","cid": "5764888998010953848"
}
},"state": {
"version": "1","property": [
{
"name": "SMS_RO_TOP","value": "1"
},{
"name": "BillingTimeStamp","value": "2020-06-12T01:00:05"
},{
"name": "timereset","value": "2020-01-12T00:35:53"
}
]
}
},{
"pool": {
"field": [
{
"name": "PoolID","value": "111100110000003505209"
},{
"name": "BillingDay","value": "9"
}
]
},"usage": {
"version": "3"
},"property": [
{
"name": "BillingTimeStamp","value": "2020-06-09T01:00:05"
},"value": "2019-03-20T17:10:38"
}
]
}
}
]
JOLT使用:
[
{
"operation": "modify-default-beta","spec": {
"state": {
"property": {
"name": "NOTAVAILABLE"
}
},"usage": {
"quota": {
"name": "NOTAVAILABLE"
}
}
}
},{
"operation": "shift","spec": {
"pool": {
"field": {
"*": {
"value": "pool_item.@(1,name)"
}
}
},// remaining elements print as it is
"*": "&"
}
}
]
预期的输出JSON:
[
{
"pool_item" : {
"BillingDay" : "12","Custom1" : "POOL_BASE_PLAN_3GB"
},"usage" : {
"version" : "3","quota" : {
"name" : "POOL_TOP_UP_1GB_2","cid" : "5764888998010953848"
}
},"state" : {
"version" : "1","property" : [ {
"name" : "SMS_RO_TOP","value" : "1"
},{
"name" : "BillingTimeStamp","value" : "2020-06-12T01:00:05"
},{
"name" : "timereset","value" : "2020-01-12T00:35:53"
} ]
}
},{
"pool_item" : {
"BillingDay" : "9","PoolID" : "111100110000003505209"
},"quota" : {
"name" : "NOTAVAILABLE"
}
},"value" : "2020-01-12T00:35:53"
} ]
}
}
]
解决方法
以下 jolt shift 规范适用于输入数组中的多个 json。
[
{
"operation": "shift","spec": {
"*": {
"pool": {
"field": {
"*": {
"value": "[&4].pool_item.@(1,name)"
}
}
},"usage": "[&1].usage","state": "[&1].state"
}
}
}
]