Tc3JsonXmlSampleJsonSaxReader

Beispiel zum Parsen von JSON-Dokumenten via SAX Reader

Dieses Beispiel veranschaulicht, wie eine JSON-Nachricht programmatisch durchlaufen werden kann. Als Basis wird der Funktionsbaustein FB_JsonSaxReader verwendet.

Deklarationsbereich

PROGRAM MAIN
VAR
  fbJson     : FB_JsonSaxReader;
  pJsonParse : JsonSaxHandler;
  sJsonDoc   : STRING(255) := '{"Values":{"Timestamp":"2017-04-04T12:42:42","Sensor1":42.42,"Sensor2":42}}';
END_VAR

Implementierungsbereich

Durch den Aufruf der Methode Parse(), die Übergabe der JSON-Nachricht als STRING und den Interface-Pointer auf eine Funktionsbaustein-Instanz, die das Interface ITcJsonSaxHandler implementiert, werden der SAX Reader aktiviert und die entsprechenden Callback-Methoden durchlaufen.

fbJson.Parse(sJson := sJsonDoc, ipHdl := pJsonParse);

Callback-Methoden

Die Callback-Methoden werden an der Instanz des Funktionsbausteins, der das Interface ITcJsonSaxHandler implementiert, aufgerufen. Jede Callback-Methode repräsentiert ein „gefundenes“ Element in der JSON-Nachricht. Zum Beispiel wird die Callback-Methode OnStartObject() aufgerufen, sobald eine geöffnete geschweifte Klammer detektiert wurde. Laut der oben genannten Beispiel-JSON-Nachricht werden also die folgenden Callback-Methoden in dieser Reihenfolge durchlaufen:

  1. OnStartObject(), aufgrund der ersten geöffneten geschweiften Klammer
  2. OnKey(), aufgrund des Properties "Values"
  3. OnStartObject(), aufgrund der zweiten geöffneten geschweiften Klammer
  4. OnKey(), aufgrund des Properties "Timestamp"
  5. OnString(), aufgrund des Werts von Property "Timestamp"
  6. OnKey(), aufgrund des Properties "Sensor1"
  7. OnLreal(), aufgrund des Werts von Property "Sensor1“"
  8. OnKey(), aufgrund des Properties "Sensor2"
  9. OnUdint(), aufgrund des Werts von Property "Sensor2"
  10. OnEndObject(), aufgrund der ersten geschlossenen geschweiften Klammer
  11. OnEndObject(), aufgrund der zweiten geschlossenen geschweiften Klammer

Innerhalb der Callback-Methoden wird der aktuelle Zustand über eine Instanz des Enums E_JsonStates definiert und gespeichert. Hierüber kann auch ermittelt werden, ob es sich um eine gültige JSON-Nachricht handelt. Wenn zum Beispiel die Callback-Methode OnLreal() aufgerufen wird und sich der Zustand nicht im erwarteten State 70 (JSON_STATE_ONLREAL) befindet, kann an die Methode der Rückgabewert S_FALSE zurückgegeben werden. Der SAX Reader beendet dann automatisch die weitere Verarbeitung.