Sort & select elements from JSON string within rules

There was recent interest in this, but in a forum hiccup the recent posts got lost.
It did remind me I’d started to play with this out of interest, but never finished. So now I did.

Using your JSON -

import java.util.HashMap
import java.util.ArrayList
import java.util.Collections


val rawjson = '[
{"periodType" : "ACTUAL","semiScheduledGeneration" : "312.66","operationalDemand" : "4728.94","rooftopSolar" : "0","createdAt" : "2020-10-18T21:05:41","wholesaleKWHPrice" : "4.7509","region" : "VIC1","period" : "2020-10-18T21:00:00","renewablesPercentage" : "0.0661162966753649","periodSource" : "30MIN","percentileRank" : "0.7454545454545455"
},
{"period" : "2020-10-18T21:30:00","periodType" : "ACTUAL","periodSource" : "5MIN","latestPeriod" : "2020-10-18T21:10:00","region" : "VIC1","rooftopSolar" : "0","usage" : "27829.71000","operationalDemand" : "27829.71000","wholesaleKWHPrice" : "4.43152","renewablesPercentage" : "0.06834","percentileRank" : "0.38181818181818183"
},
{"periodType" : "FORECAST","semiScheduledGeneration" : "350.528","operationalDemand" : "4422.45","rooftopSolar" : "0","forecastedAt" : "2020-10-18T21:00:00","forecastedAt+period" : "2020-10-18T21:00:00+2020-10-18T22:00:00","createdAt" : "2020-10-18T21:05:41","wholesaleKWHPrice" : "4.5254957000000005","period" : "2020-10-18T22:00:00","region" : "VIC1","renewablesPercentage" : "0.07926104308697668","periodSource" : "30MIN","percentileRank" : "0.5"
},
{"periodType" : "FORECAST","semiScheduledGeneration" : "348.101","operationalDemand" : "4268.82","rooftopSolar" : "0","forecastedAt" : "2020-10-18T21:00:00","forecastedAt+period" : "2020-10-18T21:00:00+2020-10-18T22:30:00","createdAt" : "2020-10-18T21:05:41","wholesaleKWHPrice" : "4.8887993000000005","period" : "2020-10-18T22:30:00","region" : "VIC1","renewablesPercentage" : "0.08154501712417014","periodSource" : "30MIN","percentileRank" : "0.7818181818181819"
},
{"periodType" : "FORECAST","semiScheduledGeneration" : "343.872","operationalDemand" : "4210.72","rooftopSolar" : "0","forecastedAt" : "2020-10-18T21:00:00","forecastedAt+period" : "2020-10-18T21:00:00+2020-10-18T23:00:00","createdAt" : "2020-10-18T21:05:41","wholesaleKWHPrice" : "4.3353760999999995","period" : "2020-10-18T23:00:00","region" : "VIC1","renewablesPercentage" : "0.08166584337120493","periodSource" : "30MIN","percentileRank" : "0.32727272727272727"
}
]' 

var forecastWS="none found" // result placeholders
var forecastStamp = "-"

var PDresults = transform("JSONPATH", "$.[?(@.periodType=='FORECAST')].period", rawjson)
   // get string results like ["2020-10-18T22:00:00", "2020-10-18T22:30:00", "2020-10-18T23:00:00"]
var WSresults = transform("JSONPATH", "$.[?(@.periodType=='FORECAST')].wholesaleKWHPrice", rawjson)
   // get string results like ["4.5254957000000005", "4.8887993000000005", "4.3353760999999995"]
   // note these are not arrays

if (PDresults !== null && WSresults !== null) { // check found some
    PDresults = PDresults.replace("[","").replace("]","")
    val PDlist = PDresults.split(",")
    WSresults = WSresults.replace("[","").replace("]","")
    val WSlist = WSresults.split(",")
        // now as Lists
    val masterMap = new HashMap<String,String>()
    for (var int i = 0; i < PDlist.size ; i++) {
        masterMap.put(PDlist.get(i),WSlist.get(i))  // key-value
    }
    // all that to load hashmap, must be a more elegant way!
    val sortedKeys=new ArrayList(masterMap.keySet())
    Collections::sort(sortedKeys)  //just sort keys as strings works okay
    forecastWS = masterMap.get(sortedKeys.last) // use bottom key for oldest
    forecastStamp = sortedKeys.last
}
logInfo("test", "Oldest forecast - " + forecastWS + " on " + forecastStamp )

outputs - Oldest forecast - “4.5254957000000005” on “2020-10-18T22:00:00”