JSONataTransformJSON
Der JSONataTransformJSON-Processor dient dazu, mithilfe eines JSONata-Skriptes JSON zu transformieren.
Auf eingehendem Content in JSON können Queries bzw. Transformationen ausgeführt werden.
Der Processor hat in IGUASU folgende extra Funktionen:
-
$nfUuid()
erzeugt eine UUID vom Typ 4 (Pseudozufallsgenerator). Die UUID wird mit einem kryptografisch starken Pseudozufallszahlengenerator erzeugt. -
Attribute aus dem Eingangs-FlowFile können (neben dem Eingangs-Content) gelesen/verarbeitet werden:
$nfGetAttribute(<name>
) -
Neben bzw. auch anstelle des Ausgangs-Contents können Ergebnisse in Attribute geschrieben werden:
$nfSetAttribute(<name>,<value>
-
Die NiFi Expression Language kann verwendet werden:
$nfEl(<expression>)
-
Es kann ein Lookup-Service verwendet werden, wenn dieser am Processor definiert wurde:
$nfLookup(<key>)
Der JSONataTransformJSON-Processor hat einen spezifischen Editor, der das einfache Bearbeiten des gesamten Skriptes erlaubt.
Sie können Ihre Transformation schnell ausprobieren, indem Sie den "Test/run"-Button verwenden |
Mehr allgemeine Information über JSONata:
Wie dieser Processor JSONata-Transformationen implementiert, unterscheidet sich leicht von try.jsonata.org! |
Die erweiterten Funktionen werden nun im Detail erläutert.
Einfache Transformation
Eingangsnachricht (auch für die weiteren Beispiele; von jsonata.org übernommen):
{
"FirstName": "Fred",
"Surname": "Smith",
"Age": 28,
"Address": {
"Street": "Hursley Park",
"City": "Winchester",
"Postcode": "SO21 2JN"
}
}
Überführung einiger dieser Daten in eine andere Form der Adresse:
{
"name": FirstName & " " & Surname,
"mobile": Phone[type = "mobile"].number,
"address": Address.City
}
Ergebnis:
{
"name": "Fred Smith",
"mobile": "077 7700 1234",
"address": "Winchester"
}
Ergebnis in Attribute schreiben
Wollen Sie die gleichen Ergebnisse in Attribute statt in den Ausgangs-Content setzen, können Sie die folgende Funktion verwenden:
-
nfSetAttribute(<name>,<value>)
Zusätzlich können Sie am Processor deaktivieren, dass das Ergebnis des Skriptes in den Ausgang geschrieben wird:
Write Output |
false |
Der Content wird also unangetastet gelassen. In diesem Fall ist das sinnvoll, da nur die Attribute erstellt werden sollen.
Das Skript sieht nun so aus:
$nfSetAttribute("name", FirstName & " " & Surname) &
$nfSetAttribute("mobile", Phone[type = "mobile"].number) &
$nfSetAttribute("city", Address.City)
Im Ergebnis erscheinen dann die Attribute:
name |
Fred Smith |
mobile |
077 7700 1234 |
city |
Winchester |
Es gibt am Processor auch noch ein Property, um das gesamte Ergebnis der Transformation in ein Attribut zu schreiben:
Write to Attribute |
<name of attribute> |
Attribute lesen
Wollen Sie im ersten Fall beispielsweise auf das Attribut filename
zugreifen, um dieses als ID in das Ergebnis zu setzen, sieht das Skript folgendermaßen aus:
{
"id": $nfGetAttribute("filename"),
"name": FirstName & " " & Surname,
"mobile": Phone[type = "mobile"].number,
"address": Address.City
}
Nutzung der NiFi Expression Language
Wollen Sie die NiFi Expression Language innerhalb eines JSONata verwenden, geht dies über die entsprechende Funktion nfEl(<expression>)
.
Im folgenden Beispiel wird die NiFi Expression Language verwendet, um mit einer Regular Expression zu prüfen, ob der Name korrekt ist (also nur entsprechende Zeichen enthält).
{
"name": FirstName & " " & Surname,
"isValidName": $nfEl("${literal('" & FirstName & " " & Surname & "'):matches('^[\\p{L} \\p{Nd}_]+$')}"),
"mobile": Phone[type = "mobile"].number,
"address": Address.City
}
Die Funktion kann zusätzlich zu der Expression eine beliebige Anzahl von name/value-Paaren aufnehmen.
Diese werden der Expression Language für die Ausführung als temporäre Attribute bereitgestellt.
Das heißt, dass sie im Gegensatz zu $nfSetAttribute(<name>,<value>)
nicht über die Ausführung hinaus gesetzt werden.
Das kann beispielsweise genutzt werden, um Werte aus dem Input für die $nfEl()
-Ausführung als Attribute mitzugeben.
Anstelle des Literals im letzten Beispiel könnte also auch Folgendes geschrieben werden:
{
...
"isValidName": $nfEl("${name:matches('^[\\p{L} \\p{Nd}_]+$')}", "name", FirstName & " " & Surname )
...
}