Created 04-03-2024 07:11 PM
I want to convert json data with both Object and Array into Object at once.
I used jolt, but I didn't reach the desired result.
The json data is as follows.
Input Data:
{ "response": { "header": { "resultCode": "00", "resultMsg": "NORMAL_SERVICE" }, "body": { "dataType": "XML", "items": { "item": { "icaoCode": null, "airportName": null, "metarMsg": { "METAR": { "automatedStation": false, "id": "metar-RKSS-20240404000000Z", "permissibleUsage": "OPERATIONAL", "status": "NORMAL", "schemaLocation": "link data link data link data link data link data", "extension": { "msgText": "METAR RKSS 040000Z 09007KT 030V120 9999 SCT035 BKN150 15/05 \n Q1015 NOSIG=" }, "observation": { "OM_Observation": { "id": "obs-RKSS-20240404000000Z", "type": { "href": "link data" }, "phenomenonTime": { "TimeInstant": { "id": "ti-20240404000000Z", "timePosition": "2024-04-04T00:00:00Z" } }, "resultTime": { "href": "#ti-20240404000000Z" }, "procedure": { "Process": { "id": "p-49-2-metar", "description": "WMO No. 49 Volume 2 Meteorological Service for International Air Navigation APPENDIX 3 TECHNICAL SPECIFICATIONS RELATED TO METEOROLOGICAL OBSERVATIONS AND REPORTS" } }, "observedProperty": { "href": "link data" }, "featureOfInterest": { "SF_SpatialSamplingFeature": { "id": "sp-RKSS", "type": { "href": "link data" }, "sampledFeature": { "AirportHeliport": { "id": "aerodrome-RKSS", "timeSlice": { "AirportHeliportTimeSlice": { "id": "aerodrome-RKSS-ts", "validTime": null, "interpretation": "BASELINE", "designator": "RKSS", "name": "GIMPO INTERNATIONAL AIRPORT", "locationIndicatorICAO": "RKSS" } } } }, "shape": { "Point": { "axisLabels": "Latitude Longitude Altitude", "id": "obs-point-RKSS", "srsName": "link data", "uomLabels": "deg deg m", "pos": "37.33 126.48 18.0" } } } }, "result": { "MeteorologicalAerodromeObservationRecord": { "cloudAndVisibilityOK": false, "id": "observation-record-RKSS-20240404000000Z", "airTemperature": { "uom": "Cel", "$": 15 }, "dewpointTemperature": { "uom": "Cel", "$": 5 }, "qnh": { "uom": "hPa", "$": 1015 }, "surfaceWind": { "AerodromeSurfaceWind": { "variableWindDirection": false, "meanWindDirection": { "uom": "deg", "$": 90 }, "meanWindSpeed": { "uom": "[kn_i]", "$": "007" }, "extremeClockwiseWindDirection": { "uom": "deg", "$": 120 }, "extremeCounterClockwiseWindDirection": { "uom": "deg", "$": "030" } } }, "visibility": { "AerodromeHorizontalVisibility": { "prevailingVisibility": { "uom": "m", "$": 10000 } } }, "cloud": { "AerodromeObservedClouds": { "layer": [ { "CloudLayer": { "amount": { "href": "link data" }, "base": { "uom": "[ft_i]", "$": 3500 }, "cloudType": { "href": "link data", "title": "Stratocumulus" } } }, { "CloudLayer": { "amount": { "href": "link data" }, "base": { "uom": "[ft_i]", "$": 15000 }, "cloudType": { "href": "link data", "title": "Altocumulus" } } } ] } } } } } }, "trendForecast": { "OM_Observation": { "id": "trend-fcst-1", "type": { "href": "link data" }, "phenomenonTime": { "href": "#ti-20240404000000Z" }, "resultTime": { "href": "#ti-20240404000000Z" }, "procedure": { "href": "#p-49-2-metar" }, "observedProperty": { "href": "link data" }, "featureOfInterest": { "href": "#sp-RKSS" }, "result": { "MeteorologicalAerodromeTrendForecastRecord": { "changeIndicator": "NO_SIGNIFICANT_CHANGES", "cloudAndVisibilityOK": false, "id": "trend-fcst-record-1-20240404000000Z" } } } } } } } }, "numOfRows": 10000, "pageNo": 1, "totalCount": 1 } } }
Jolt Spec:
[ { "operation": "shift", "spec": { "response": { "body": { "items": { "item": { "*": { "*": { "extension": { "msgText": "msgText" }, "observation": { "OM_Observation": { "phenomenonTime": { "TimeInstant": { "timePosition": "phenomenonTime" } }, "featureOfInterest": { "SF_SpatialSamplingFeature": { "sampledFeature": { "AirportHeliport": { "timeSlice": { "AirportHeliportTimeSlice": { "name": "featureOfInterest" } } } }, "shape": { "Point": { "pos": "shape" } } } }, "result": { "MeteorologicalAerodromeObservationRecord": { "airTemperature": { "\\$": "airTemperature" }, "dewpointTemperature": { "\\$": "dewpointTemperature" }, "qnh": { "\\$": "qnh" }, "surfaceWind": { "AerodromeSurfaceWind": { "meanWindDirection": { "\\$": "meanWindDirection" }, "meanWindSpeed": { "\\$": "meanWindSpeed" }, "windGustSpeed": { "\\$": "windGustSpeed" }, "extremeClockwiseWindDirection": { "\\$": "extremeClockwiseWindDirection" }, "extremeCounterClockwiseWindDirection": { "\\$": "extremeCounterClockwiseWindDirection" } } }, "visibility": { "AerodromeHorizontalVisibility": { "prevailingVisibility": { "\\$": "AerodromeHorizontalVisibility" } } }, "presentWeather": { "href": "presentWeather" }, "cloud": { "AerodromeObservedClouds": { "layer": { "*": { "CloudLayer": { "amount": { "href": "cloud_amount" }, "base": { "\\$": "cloud_base" }, "cloudType": { "href": "cloudType_href", "title": "cloudType" } } } } } } } } } } } } } } } } } }, { "operation": "shift", "spec": { "msgText": "&", "phenomenonTime": "&", "featureOfInterest": "&", "shape": "&", "airTemperature": "&", "dewpointTemperature": "&", "qnh": "&", "meanWindDirection": "&", "meanWindSpeed": "&", "windGustSpeed": "&", "extremeClockwiseWindDirection": "&", "extremeCounterClockwiseWindDirection": "&", "AerodromeHorizontalVisibility": "&", "cloud_amount": "&", "cloud_base": "&", "cloudType_href": "&", "cloudType": "&", "presentWeather": "&" } }, { "operation": "modify-overwrite-beta", "spec": { "airTemperature": "=toString", "dewpointTemperature": "=toString", "qnh": "=toString", "meanWindDirection": "=toString", "meanWindSpeed": "=toString", "extremeClockwiseWindDirection": "=toString", "extremeCounterClockwiseWindDirection": "=toString", "AerodromeHorizontalVisibility": "=toString", "cloud_amount": "=toString", "cloud_base": "=toString", "cloudType_href": "=toString", "cloudType": "=toString" } } ]
OutPut Data:
{ "msgText" : "METAR RKSS 040000Z 09007KT 030V120 9999 SCT035 BKN150 15/05 \n Q1015 NOSIG=", "phenomenonTime" : "2024-04-04T00:00:00Z", "featureOfInterest" : "GIMPO INTERNATIONAL AIRPORT", "shape" : "37.33 126.48 18.0", "airTemperature" : "15", "dewpointTemperature" : "5", "qnh" : "1015", "meanWindDirection" : "90", "meanWindSpeed" : "007", "extremeClockwiseWindDirection" : "120", "extremeCounterClockwiseWindDirection" : "030", "AerodromeHorizontalVisibility" : "10000", "cloud_amount" : [ "link data", "link data" ], "cloud_base" : [ "3500", "15000" ], "cloudType_href" : [ "link data", "link data" ], "cloudType" : [ "Stratocumulus", "Altocumulus" ] }
Expected data:
{ "msgText" : "METAR RKSS 040000Z 09007KT 030V120 9999 SCT035 BKN150 15/05 \n Q1015 NOSIG=", "phenomenonTime" : "2024-04-04T00:00:00Z", "featureOfInterest" : "GIMPO INTERNATIONAL AIRPORT", "shape" : "37.33 126.48 18.0", "airTemperature" : "15", "dewpointTemperature" : "5", "qnh" : "1015", "meanWindDirection" : "90", "meanWindSpeed" : "007", "extremeClockwiseWindDirection" : "120", "extremeCounterClockwiseWindDirection" : "030", "AerodromeHorizontalVisibility" : "10000", "cloud_amount0" : "link data", "cloud_amount1" : "link data" "cloud_base0" : "3500", "cloud_base1" : "15000", "cloudType_href0" : "link data", "cloudType_href1" : "link data", "cloudType0" : "Stratocumulus", "cloudType1" : "Altocumulus" }
As above, could you please advise a jolt script in which the data I expect is output?
Created on 04-05-2024 12:26 PM - edited 04-05-2024 12:27 PM
Hi @Nicanor ,
Let's take a below example:
Json Input:
[
{
"cloud_base": [
"3500",
"15000"
],
"cloudType": [
"Stratocumulus",
"Altocumulus"
]
}
]
Jolt Spec:
[
{
"operation": "shift",
"spec": {
"*": {
"cloud_base": {
"*": {
"*": {
"@1": "cloud_base_&"
}
}
},
"cloudType": {
"*": {
"*": {
"@1": "cloudType_&"
}
}
}
}
}
}
]
Output:
{
"cloud_base_3500" : "3500",
"cloud_base_15000" : "15000",
"cloudType_Stratocumulus" : "Stratocumulus",
"cloudType_Altocumulus" : "Altocumulus"
}
"Accept as Solution" if its work for you.
Created 04-04-2024 01:35 AM
Hi @Nicanor, Welcome to our community! To help you get the best possible answer, I have tagged in our NiFi experts @MattWho @SAMSAL who may be able to assist you further.
Please feel free to provide any additional information or details about your query, and we hope that you will find a satisfactory solution to your question.
Regards,
Vidya Sargur,Created on 04-04-2024 03:02 AM - edited 04-04-2024 03:04 AM
Hi @Nicanor,
you can bring another JoltTransformJSON processor and write down the below JOLT spec to extract the element of list.
JOLT Spec
[
{
"operation": "shift",
"spec": {
"msgText": "&",
"phenomenonTime": "phenomenonTime",
"cloud_base": "cloud_base_List",
"cloud_amount": "cloud_amount_List"
}
},
// Extracting Values from the List
{
"operation": "modify-overwrite-beta",
"spec": {
// Extract the last element from each list
"cloud_base1": "=lastElement(@(1,cloud_base_List))",
"cloud_base2": "=firstElement(@(1,cloud_base_List))"
}
}
]
JOLT Output
{
"msgText" : "METAR RKSS 040000Z 09007KT 030V120 9999 SCT035 BKN150 15/05 \n Q1015 NOSIG=",
"phenomenonTime" : "2024-04-04T00:00:00Z",
"cloud_base_List" : [ 3500, 15000 ],
"cloud_amount_List" : [ "link data", "link data" ],
"cloud_base1" : 15000,
"cloud_base2" : 3500
}
One more suggestion, please remove the unrequired line of code. you can typecast the data type by using UpdateRecord processor. Because JOLT transformation may consume large amounts of memory.
[
{
"operation": "shift",
"spec": {
"response": {
"body": {
"items": {
"item": {
"*": {
"*": {
"extension": {
"msgText": "msgText"
},
"observation": {
"OM_Observation": {
"phenomenonTime": {
"TimeInstant": {
"timePosition": "phenomenonTime"
}
},
"featureOfInterest": {
"SF_SpatialSamplingFeature": {
"sampledFeature": {
"AirportHeliport": {
"timeSlice": {
"AirportHeliportTimeSlice": {
"name": "featureOfInterest"
}
}
}
},
"shape": {
"Point": {
"pos": "shape"
}
}
}
},
"result": {
"MeteorologicalAerodromeObservationRecord": {
"airTemperature": {
"\\$": "airTemperature"
},
"dewpointTemperature": {
"\\$": "dewpointTemperature"
},
"qnh": {
"\\$": "qnh"
},
"surfaceWind": {
"AerodromeSurfaceWind": {
"meanWindDirection": {
"\\$": "meanWindDirection"
},
"meanWindSpeed": {
"\\$": "meanWindSpeed"
},
"windGustSpeed": {
"\\$": "windGustSpeed"
},
"extremeClockwiseWindDirection": {
"\\$": "extremeClockwiseWindDirection"
},
"extremeCounterClockwiseWindDirection": {
"\\$": "extremeCounterClockwiseWindDirection"
}
}
},
"visibility": {
"AerodromeHorizontalVisibility": {
"prevailingVisibility": {
"\\$": "AerodromeHorizontalVisibility"
}
}
},
"presentWeather": {
"href": "presentWeather"
},
"cloud": {
"AerodromeObservedClouds": {
"layer": {
"*": {
"CloudLayer": {
"amount": {
"href": "cloud_amount"
},
"base": {
"\\$": "cloud_base"
},
"cloudType": {
"href": "cloudType_href",
"title": "cloudType"
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
]
"Accept as Solution" if its work for you.
Created 04-04-2024 09:15 PM
Thank you for your solution.
It was a lot of inspiration for me.
Therefore, I would like to ask you another question.
Expected data:
{ "cloud_amount0" : "link data0", "cloud_amount1" : "link data1",
"cloud_amount2" : "link data2",
"cloud_amount3" : "link data3", }
Is there a jolt whose key name is dynamically increasing like 'cloud_mount'?
Created 04-05-2024 11:24 AM
Created on 04-05-2024 12:26 PM - edited 04-05-2024 12:27 PM
Hi @Nicanor ,
Let's take a below example:
Json Input:
[
{
"cloud_base": [
"3500",
"15000"
],
"cloudType": [
"Stratocumulus",
"Altocumulus"
]
}
]
Jolt Spec:
[
{
"operation": "shift",
"spec": {
"*": {
"cloud_base": {
"*": {
"*": {
"@1": "cloud_base_&"
}
}
},
"cloudType": {
"*": {
"*": {
"@1": "cloudType_&"
}
}
}
}
}
}
]
Output:
{
"cloud_base_3500" : "3500",
"cloud_base_15000" : "15000",
"cloudType_Stratocumulus" : "Stratocumulus",
"cloudType_Altocumulus" : "Altocumulus"
}
"Accept as Solution" if its work for you.