Zuordnungsausdruckssprache
Sie können die Zuordnungsausdruckssprache verwenden, um Daten zu bearbeiten und zu kombinieren und um die Ergebnisse von Abfragen zu formatieren, die für die von Ihnen verarbeiteten Daten ausgeführt werden können.
Die Zuordnungsausdruckssprache ist eine Untergruppe von JSONata und kann verwendet werden, wenn Zuordnungen definiert oder Regeln erstellt werden.
JSONata stellt eine Lightweight-Abfrage- und -Transformationssprache für JSON-Daten dar. Das Tool JSONata Exerciser ist ebenfalls verfügbar und bietet eine schnelle und bequeme Möglichkeit, JSONata auszuprobieren.
In den folgenden Informationen werden die Schlüsseloperatoren und Funktionen dargestellt, die momentan unterstützt werden. Außerdem werden einige Beispiele zu deren Verwendung aufgeführt.
Ausdruckssprache und Benachrichtigungsregeln
Die Zuordnungsausdruckssprache wurde zur Verwendung mit der Benachrichtigungsregelfunktion des Datenmanagements durch die Einführung von $state -und $instance -Variablen erweitert, die für die Verwendung in Ausdrücken definiert sind.
- Die Variable
$statewird verwendet, um auf Eigenschaften im Einheitenstatus in einem Ausdruck zu verweisen, z. B.$state.temperature. - Die Variable
$instancewird verwendet, um Attribute und Metadaten in der Einheiteninstanz in einem Ausdruck zu referenzieren, z. B.$instance.metadata.tempThresholdMax.
Sie können diese Variablen verwenden, damit Sie in Ihren Bedingungsausdrücken von Benachrichtigungsregeln keine fest codierten Werte benötigen und für die einzelnen Geräteinstanzen einen anderen Schwellenwert festlegen können.
JSONata-Operatoren
Alle JSONata-Operatoren werden unterstützt, mit Ausnahme der im Folgenden aufgelisteten:
- Pfadoperatoren
Nicht unterstützt:^(…)(Order-by)
- Numerische Operatoren
- Vergleichsoperatoren
- Boolesche Operatoren
- Andere Operatoren
Nicht unterstützt:~>(Kette):=(Variablenbindung)... ~> | ... | ... |(Transformieren)
- Verwenden Sie die Klammer
( )für die Ausdrucksgruppierung und ändern Sie die Vorrangstellung für Operatoren. - Verwenden Sie einzelne oder doppelte Anführungszeichen, um Zeichenfolgen und Eigenschaftsnamen zu umgeben, z. B.
$event.object.'ab'. - Verwenden Sie Backticks, um Eigenschaftsnamen zu umgeben, die Sonderzeichen (einschließlich Leerzeichen) enthalten. Beispiel:
{"x y":22}.`x y` - Verwenden Sie Backticks, um Eigenschaftsnamen einzuschließen, die mit einer Ziffer beginnen. Beispiel:
`7emperature`
JSONata-Funktionen
- Alle Zeichenfolgefunktionen
- Alle numerischen Funktionen
- Alle numerischen Aggregationsfunktionen
- Alle booleschen Funktionen
- Die folgenden Array-Funktionen:
- $count
- $append
Zuordnungsausdruckssprache erweitern
Die Zuordnungsausdruckssprache wurde durch die Einführung der Variablen '$event', '$state' und '$instance' ergänzt und kann nun zusammen mit der Funktion für das Datenmanagement verwendet werden. JSON wird an diese Variablen gebunden, bevor der Ausdruck ausgewertet wird. In der folgenden Tabelle erhalten Sie einen Überblick über diese Variablen, die zur Verwendung in Ausdrücken definiert sind.
| Variable | Beispieleingabe - JSON | Beispiel als Ausdruck | Verwendungszweck |
|---|---|---|---|
$event |
{"t": 34.5} |
$event.t |
Wählen Sie eine Eigenschaft eines eingehenden Ereignisses zur Verwendung in einem Ausdruck aus. |
$state |
{"temperature": 34.5,"humidity": 78 } |
$state.temperature |
Wählen Sie eine Eigenschaft zum Gerätestatus zur Verwendung in einem Ausdruck aus. |
$instance |
{"deviceId": "tSensor","typeId": "humiditySensor","metadata":
{"temp_adjustment": 50}} |
$instance.metadata.temp_adjustment |
Wählen Sie das Attribut für das Gerät oder den Gerätetyp zur Verwendung in einem Ausdruck aus. |
Im folgenden Beispiel wird das folgende Objekt als Eingabe für ein Ereignis verwendet:
{
"temperature": 35,
"humidity": 72,
"pressure": 1024
}
Das Objekt wird unter Verwendung des folgenden Ausdrucks in ein Array konvertiert:
[$event.temperature, $event.humidity, $event.pressure]
Der Ausdruck führt zur folgenden Ausgabe:
[
35,
72,
1024
]
Sie können dieses Beispiel umkehren und ein Array von der Eingabe in ein Objekt konvertieren. Im folgenden Beispiel wird das folgende Array als Eingabe für ein Ereignis verwendet:
{
"readings": [
35,
72,
1024
]
}
Das Array wird unter Verwendung des folgenden Ausdrucks in ein Objekt konvertiert:
{"temperature": $event.readings[0], "humidity": $event.readings[1], "pressure": $event.readings[2]}
Der Ausdruck führt zur folgenden Ausgabe:
{
"temperature": 35,
"humidity": 72,
"pressure": 1024
}
Sie können auch einen Ausdruck definieren, in dem diese Variablen gemeinsam verwendet werden. Im folgenden Beispiel wird eine Eigenschaft temp_adjustment in den Gerätemetadaten definiert und zum Kalibrieren der Ereignisablesung verwendet. Die Eigenschaft ist in einer Zuordnung definiert, kann jedoch auf viele Geräte angewendet werden.
"propertyMappings" : {
"tevt" : {
"temperature" : "$event.t + $instance.metadata.temp_adjustment"
}
},
Der Punktoperator "." wird für den Objektzugriff mit einem Literalschlüssel verwendet, z. B. '$event.object.hh'. Der erste Ausdruck, im Beispiel $event.t, ist auf eine bestimmte Eigenschaft beschränkt, entweder im Ereignis ($event) oder im Status ($state) oder in den Metadaten ($instance). Der zweite Ausdruck, im Beispiel $instance.metadata.temp_adjustment, enthält die Informationen, auf die Sie möglicherweise zugreifen möchten.
Sprachenhandbuch
- Alle einfachen Abfragen werden unterstützt.
- Mit Ausnahme von Platzhalterzeichen werden Prädikatabfragen unterstützt.
- Klammerausdrücke werden unterstützt, mit Ausnahme von Codeblöcken.
- Die folgenden Bedingungsausdrücke werden unterstützt:
- Bedingungslogik
- Variablen
Variablen werden durch die Verwendung der Variablen$instance,$stateund$eventals Teil der erweiterten Zuordnungssprache unterstützt, die für diese Datenmanagementfunktion spezifisch ist.Hinweis: Die Variablen$und$$, die in JSONata verwendet werden, werden derzeit nicht unterstützt. - Aufruf der meisten vordefinierten Funktionen.Hinweis: Sie können keine eigenen Funktionen definieren.
Ausgabe wird erstellt
Sie können angeben, wie verarbeitete Daten in der Ausgabe mithilfe von Array-Konstruktoren oder Objektkonstruktoren dargestellt werden.
Unterstützte Array-Konstruktoren
Arrays können erstellt werden, indem eine durch Kommas getrennte Liste von Literalen oder Ausdrücken in eckige Klammern eingeschlossen wird. Kommas werden verwendet, um mehrere Ausdrücke innerhalb des Array-Konstruktors zu trennen, z. B. [1, 3-1] = [1,2], [1..3] ->
[1,2,3] und [1..3, 7..9] -> [1,2,3,7,8,9].
Unterstützte Objektkonstruktoren
Sie können JSON-Objekte in Ihrer Ausgabe erstellen, indem Sie ein Paar geschweifter Klammern {} verwenden, die Schlüsselwerte oder Paare enthalten, die durch Kommas getrennt sind, wobei jeder Schlüssel und jeder Wert durch einen Doppelpunkt getrennt sind, z. B. {key1 : value1, key2:value2} oder {"hello" : "world"}. Der Objektschlüssel muss eine Zeichenfolge sein.
Beispiel: Es werden Arrays zum Verarbeiten und Berichten von Temperaturdaten verwendet.
Die folgenden Abschnitte bauen auf dem Beispiel in Erste Schritte mit der Datenverwaltung über REST-APIs auf, um zu zeigen, wie Sie Arrays verwenden können, um ein gleitendes Fenster mit Temperaturablesungen zu verwalten, und die aktuelle Summe oder den Durchschnittswert der in diesem Fenster enthaltenen Lesart berechnen.
Ein gleitendes Fenster dient zur Speicherung von Daten in der Reihenfolge ihres Eingangs. Anstatt alle jemals eingefügten Daten beizubehalten, können gleitende Fenster so konfiguriert werden, dass Daten in inkrementeller Vorgehensweise entfernt werden. Wenn ein gleitendes Fenster sich der maximalen Füllung nähert, dann führt jede weitere Einfügung zur Entfernung des jeweils ältesten Datenelements im Fenster.
Im folgenden Beispiel wird ein gleitendes Fenster gezeigt, das mit einer zählerbasierten Bereinigungsrichtlinie der Größe 5 konfiguriert wurde:
() -> (1) -> (2, 1) -> (3, 2, 1) -> (4, 3, 2, 1) -> (5, 4, 3, 2, 1) -> (6, 5, 4, 3, 2) -> (7, 6, 5, 4, 3) -> ...
Das folgende Beispiel zeigt, wie die Konfiguration der Schemadatei der logischen Schnittstelle, die in Schritt 7 der Schritt-für-Schritt-Anleitung 1gezeigt wird, durch Hinzufügen eines Arrays mit dem Namen tempReadingsgeändert werden kann. Der Array wird zur Verwaltung eines Fensters der letzten 5 Werte verwendet, die von Geräten für die letzten 5 Ereignisse gesendet wurden. Wenn in tempReadingskeine Werte gespeichert sind, wird das Array auf 0 gesetzt und der nächste empfangene Messwert wird an das Array angehängt, das anwächst, bis 5 Zählerstände empfangen werden. Nach Empfang von 5 Messwerten führt ein weiterer neuer Messwert zur Entfernung des ältesten Messwerts aus dem Fenster.
tempReadings als "required"und standardmäßig als Array festlegen.{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {},
"properties": {
"temperature": {
"description" : "latest temperature reading in degrees Celsius",
"type" : "number",
"minimum" : -273.15,
"default" : 0.0
},
"tempAverage": {
"type": "number"
},
"tempReadings": {
"default": [],
"items": {
"type": "number"
},
"type": "array"
},
"tempSum": {
"type": "number"
}
},
"required": [
"tempReadings"
],
"type": "object"
}
Im folgenden Abschnitt wird ein Beispiel zur Vorgehensweise bei der Konfiguration der Zuordnungsressource zur Berechnung der durchschnittlichen Temperaturmesswerte gezeigt. Außerdem wird die Summe aller Temperaturmesswerte auf Basis der Messwerte dargestellt, die im aktuellen gleitenden Fenster enthalten sind:
[
{
"created": "2017-10-13T09:21:36Z",
"createdBy": "admin",
"logicalInterfaceId": "5846ec826522050001db0e12",
"notificationStrategy": "on-state-change",
"propertyMappings": {
"tevt": {
"tempAverage": "$average($count($state.tempReadings)<5?$append($state.tempReadings, $event.t):$append($state.tempReadings[[1..4]], $event.t))",
"tempReadings": "$count($state.tempReadings)<5?$append($state.tempReadings, $event.t):$append($state.tempReadings[[1..4]], $event.t)",
"tempSum": "$sum($count($state.tempReadings)<5?$append($state.tempReadings, $event.t):$append($state.tempReadings[[1..4]], $event.t))"
}
},
"updated": "2017-10-13T10:05:40Z",
"updatedBy": "a-8x7nmj-9iqt56kfil",
"version": "active"
}
]
$state.tempReadings wird neu berechnet, bevor es in den Funktionen $average und $sum verwendet wird. Die Neuberechnung des Arrays ist erforderlich, um sicherzustellen, dass das Array die aktuellen Werte enthält, wenn der Ausdruck tempAverage oder tempSum ausgewertet wird, da die Reihenfolge der Zuordnungsausdrücke nicht gesteuert werden kann.Das folgende Beispiel zeigt die durchschnittliche Temperatur und die summierte Temperatur auf Basis eines gleitenden Fensters von 5 Temperaturmesswerten:
{
"state": {
"tempAverage": 18557.6,
"tempReadings": [
17591,
10262,
25621,
16676,
22638
],
"tempSum": 92788
},
"timestamp": "2017-10-13T11:07:20Z",
"updated": "2017-10-13T11:05:40Z"
}
Behandlung von Fehlübereinstimmungen zwischen Zuordnungsausdruck und Eingabedaten
Eine Statusaktualisierung kann fehlschlagen, wenn einer der Zuordnungsausdrücke einen Verweis auf Eingabedaten enthält, die in dem veröffentlichten Ereignis nicht angegeben sind.
Sie können zum Beispiel die folgenden Ausdrücke konfigurieren:
temperature = $event.t
humidity = $event.hum
Dabei ist t eine optionale Eigenschaft für das Ereignis.
Wenn ein Ereignis empfangen wird, das nur Feuchtigkeitsdaten enthält, z. B. {"humidity":22}, schlägt die Auswertung des Ausdrucks temperature = $event.t fehl, da die optionale Eigenschaft T im publizierten Geräteereignis nicht angegeben ist.
Die Statusaktualisierung schlägt fehl. Die Eigenschaft für den Feuchtigkeitsstatus wird nicht aktualisiert und im MQTT-Fehlertopic für das Gerät wird eine Fehlernachricht publiziert:
iot-2/type/${typeId}/id/${deviceId}/err/data
Um zu verhindern, dass Statusaktualisierungsfehler aufgrund von nicht angegebenen optionalen Daten auftreten, können Sie die Funktion '$exists' in Kombination mit einem ternären Zustand verwenden, um einen Standardwert für optionale Eigenschaften anzugeben. Im folgenden Beispiel wird der Standardwert 0 für die Eigenschaft t definiert:
"tempEvent:
{
"temperature": "$exists($event.t)?$event.t:0",
"humidity": "$event.hum"
}
Wenn Sie auf diese Weise einen Standardwert für die optionale Eigenschaft definieren, wird der Ausdruck erfolgreich ausgewertet, auch wenn die Eigenschaft t im publizierten Geräteereignis nicht angegeben ist.
Wenn das Ereignis {"humidity":22} empfangen wird, wird die Statusaktualisierung erfolgreich abgeschlossen und der Gerätestatus auf {"humidity":22, "temperature":0}gesetzt.