FYI, you can streamline that a little:
transaction?.response?.resultPacket?.results.each() { result ->
// Map any metaData that has string values "true" or "false" to customData
result.metaData.each { key, value ->
// toBoolean() returns a true if this value (case-insensitve) represents a true boolean, otherwise false
// The second branch is needed to check for 'real' false boolean values
if ( ['1', 'true', '0', 'false'].contains(value.toLowerCase()) ){
result.customData.put(key, value.toBoolean())
}
}
}