Getting Started
Dieser Dokumentationsartikel soll Ihnen einen ersten, schnellen Start in die Verwendung der Tc3_JsonXml SPS-Bibliothek ermöglichen. Der Artikel geht hierbei von folgendem Anwendungsfall aus:
- Es existiert ein JSON Dokument, welches weiterverarbeitet werden soll.
- Das JSON Dokument liegt in Form einer Datei auf dem lokalen Dateisystem.
- Der Artikel beschreibt die einzelnen Schritte zum Parsen des JSON Dokuments.
Für weitere Code-Beispiele empfehlen wir auch unsere Samples.
Inhalt der Datei
Die Datei myJsonContent.json liegt im lokalen Dateisystem unter folgendem Pfad: c:\temp\myJsonContent.json und hat den folgenden Inhalt:
{
"Timestamp":"2017-04-04T12:42:42",
"Values": {
"Sensor1": 42.41999816894531,
"Sensor2": [1,2,3,4,5],
"Sensor3": 10
}
}
Deklarationen
Die folgenden Variablen-Deklarationen werden für das weitere Vorgehen benötigt:
fbJson : FB_JsonDomParser;
jsonRoot : SJsonValue;
jsonProp : SJsonValue;
jsonIterator : SJsonValue;
jsonIteratorEnd : SJsonValue;
bLoadJsonFile : BOOL;
sTimestamp : STRING;
fSensor1 : LREAL;
aSensor2 : ARRAY[0..4] OF DINT;
nSensor3 : DINT;
i : UINT;
Bitte stellen Sie des Weiteren sicher, dass Sie eine Referenz zu der SPS-Bibliothek Tc3_JsonXml zu Ihrem SPS-Projekt hinzugefügt haben.
Einlesen der Datei
Zum Einlesen der Datei wird die Methode LoadDocumentFromFile aus dem Funktionsbaustein FB_JsonDomParser verwendet. Die Ausführung der Methode wird über eine steigende Flanke am Eingang bExec
gesteuert.
IF bLoadJsonFile = TRUE THEN
fbJson.LoadDocumentFromFile('C:\Temp\myJsonContent.json', bLoadJsonFile);
END_IF
![]() | Quelle des JSON Dokuments Falls in Ihrem Anwendungsfall das JSON Dokument bereits in der SPS vorliegt, z. B. in einer Variablen vom Datentyp STRING, so können Sie die Methode ParseDocument verwenden, um das Dokument in den Speicher zu laden und weiter zu verarbeiten. |
Parsen des JSON Dokuments
Mit der Methode GetDocumentRoot lässt sich der Anfang des JSON Dokuments im Speicher referenzieren. Der Rückgabewert der Methode ist ein Interface Pointer.
jsonRoot := fbJson.GetDocumentRoot();
Von hier können nun die weiteren Keys auf erster Ebene ausgelesen werden, z. B. der Key 'Timestamp' über die Methode GetString:
jsonProp := fbJson.FindMember(jsonRoot, 'Timestamp');
IF (jsonProp <> 0) THEN
sTimestamp := fbJson.GetString(jsonProp);
END_IF
Bei dem nächsten Key ('Values') handelt es sich um ein verschachteltes JSON Objekt. Die Kindelemente von diesem Objekt können über die Methode FindMemberPath direkt ausgelesen werden, zum Beispiel für das Element 'Values/Sensor1':
jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor1');
IF (jsonProp <> 0) THEN
fSensor1 := fbJson.GetDouble(jsonProp);
END_IF
Bei dem nächsten Kindelement ('Values/Sensor2') handelt es sich um ein Array. Dieses kann über die Verwendung der Methoden ArrayBegin und ArrayEnd ausgelesen werden.
jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor2');
IF (jsonProp <> 0) THEN
jsonIterator := fbJson.ArrayBegin(jsonProp);
jsonIteratorEnd := fbJson.ArrayEnd(jsonProp);
WHILE jsonIterator <> jsonIteratorEnd DO
IF (jsonProp <> 0) THEN
aSensor2[i] := fbJson.GetInt(jsonIterator);
END_IF
jsonIterator := fbJson.NextArray(jsonIterator);
i := i + 1;
END_WHILE
i := 0;
END_IF
Das nächste Kindelement ('Values/Sensor3') ist ähnlich in der Handhabung wie das Element 'Values/Sensor1'. Anstelle der Methode GetDouble wird hier dann jedoch die Methode GetInt verwendet, um den Wert des Keys auszulesen.
jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor3');
IF (jsonProp <> 0) THEN
nSensor3 := fbJson.GetInt(jsonProp);
END_IF
Komplettes Codebeispiel
Im Folgenden finden Sie die obigen Code-Snippets einmal als vollständiges Beispiel.
Deklarationsteil
PROGRAM MAIN
fbJson : FB_JsonDomParser;
jsonRoot : SJsonValue;
jsonProp : SJsonValue;
jsonIterator : SJsonValue;
jsonIteratorEnd : SJsonValue;
bLoadJsonFile : BOOL;
sTimestamp : STRING;
fSensor1 : LREAL;
aSensor2 : ARRAY[0..4] OF DINT;
nSensor3 : DINT;
i : UINT;
END_VAR
Implementierungsteil
IF bLoadJsonFile = TRUE THEN
fbJson.LoadDocumentFromFile('C:\Temp\myJsonContent.json', bLoadJsonFile);
jsonRoot := fbJson.GetDocumentRoot();
jsonProp := fbJson.FindMember(jsonRoot, 'Timestamp');
IF (jsonProp <> 0) THEN
sTimestamp := fbJson.GetString(jsonProp);
END_IF
jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor1');
IF (jsonProp <> 0) THEN
fSensor1 := fbJson.GetDouble(jsonProp);
END_IF
jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor2');
IF (jsonProp <> 0) THEN
jsonIterator := fbJson.ArrayBegin(jsonProp);
jsonIteratorEnd := fbJson.ArrayEnd(jsonProp);
WHILE jsonIterator <> jsonIteratorEnd DO
IF (jsonProp <> 0) THEN
aSensor2[i] := fbJson.GetInt(jsonIterator);
END_IF
jsonIterator := fbJson.NextArray(jsonIterator);
i := i + 1;
END_WHILE
i := 0;
END_IF
jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor3');
IF (jsonProp <> 0) THEN
nSensor3 := fbJson.GetInt(jsonProp);
END_IF
END_IF
Nach dem erfolgreichen Durchlauf des obigen Codes befinden sich die ausgelesenen Keys in den entsprechenden SPS Variablen, z. B. wie folgt:
