It is quite easy to evaluate Xpath expression in Iflow and assign them to Property or Header. But there is no direct way of evaluating JSON body and extract information we require. We can write a Groovy script to parse JSON body and extract information required but then we have to write custom script for each payload type. In this blog I’ll try to provide generic Groovy script which can be used to extract values from JSON body.
GPath option in Groovy
The most common way of querying XML in Groovy is using GPath. In order to use GPath for JSON body we need to parse the input body using JsonSlurper. GPath uses dot notation to evaluate, so something very similar to javascript. As an example, you can specify a path to an object or element of interest:
{
"a": {
"b": {
"c": "hello"
}
}
}
a.b.c → yields the c properties for all the b properties of a
More information regarding Gpath can be found here – https://groovy-lang.org/processing-xml.html#_gpath
Evaluate GPath Expression
Now we know GPath expression, but in order to evaluate the expression we will be using groovy.util.Eval class which is available with Groovy. This class is a simple helper on top of GroovyShell. You can use it to evaluate small Groovy scripts that don’t need large Binding objects.
Define Parameters
Parameters to Groovy script will be passed via properties –
gpath_expr (Required) – Just like Xpath expression we should have input parameter to pass GPath expression.
gpath_setproperty (Optional) – Extracted value should be assigned to this property
gpath_setheader (Optional) – Extracted value should be assigned to this header
if both gpath_setproperty and gpath_setheader are not defined, the extracted value will be set gpath_result property
Code
import com.sap.gateway.ip.core.customdev.util.Message
import java.util.HashMap
def Message processData(Message message) {
try {
def jsonSlurper = new groovy.json.JsonSlurper();
def properties = message.getProperties();
if (properties.get('gpath_expr') != null) {
def request = jsonSlurper.parseText(message.getBody(java.lang.String) as String);
def gpath_result = groovy.util.Eval.x(request, 'x.' + properties.get('gpath_expr'));
if (properties.get('gpath_setproperty') != null)
message.setProperty(properties.get('gpath_setproperty'), gpath_result.toString());
else if (properties.get('gpath_setheader') != null)
message.setHeader(properties.get('gpath_setheader'), gpath_result.toString());
else
message.setProperty('gpath_result', gpath_result.toString());
}
} catch (Exception ex) {
message.setProperty('gpath_error', ex.getMessage());
}
return message;
}
Example
Let’s see below JSON body example –
{
"Attachments": [
{
"Data": "V2VsY29tZXRvbXl3b3JsZA==",
"FileId": "fileid123"
}
],
"EventName": "RequestReceived",
"EventProperties": {
"OrderId": "12345",
"Timestamp": "2022-02-01T11:00:00"
},
"Severity": "INFO",
"TxId": "2345r"
}
Pass gpath_expr as below –
- gpath_expr = ‘EventProperties.OrderId’ , gpath_setproperty = ‘OrderId’ -> Output property OrderId = ‘12345’
- gpath_expr = ‘EventProperties.Timestamp’ , gpath_setheader = ‘CreationTime’ -> Output header CreationTime = ‘2022-02-01T11:00:00’
- gpath_expr = ‘Attachments[0].FileId’ -> Output property gpath_result = ‘fileid123’
Summary
In this way you can dynamically use GPath expression to evaluate and extract data from JSON. Kindly comment below and let me know if you more suggestion or ideas.