Tc3JsonXmlSampleJsonDataType

Beispiel zum automatischen Konvertieren von Strukturen in eine JSON-Nachricht

Dieses Beispiel veranschaulicht, wie eine Datenstruktur in eine JSON-Nachricht (und umgekehrt) konvertiert werden kann. Bei der Konvertierung wird der Aufbau einer Struktur eins-zu-eins in ein entsprechendes JSON-Äquivalent überführt. Über SPS-Attribute an den Member-Variablen der Struktur können zusätzlich Metadaten angelegt werden.

Aufbau der zu konvertierenden Datenstruktur

TYPE ST_Values :
STRUCT

  {attribute 'Unit' := 'm/s'}
  {attribute 'DisplayName' := 'Speed'}
  Sensor1 : REAL;

  {attribute 'Unit' := 'V'}
  {attribute 'DisplayName' := 'Voltage'}
  Sensor2 : DINT;

  {attribute 'Unit' := 'A'}
  {attribute 'DisplayName' := 'Current'}
  Sensor3 : DINT;

END_STRUCT
END_TYPE

Deklarationsbereich

PROGRAM MAIN
VAR
  dtTimestamp    : DATE_AND_TIME := DT#2017-04-04-12:42:42;
  fbJson         : FB_JsonSaxWriter;
  fbJsonDataType : FB_JsonReadWriteDataType;
  sJsonDoc       : STRING(255); 
  sJsonDoc2      : STRING(2000); 
  stValues       : ST_Values;
END_VAR

Implementierungsbereich

Ausgehend von der Instanz fbJson des Funktionsbausteins FB_JsonSaxWriter werden zwei Wege zum Generieren der JSON-Nachricht gezeigt. Bei einer JSON-Nachricht mit nicht mehr als 255 Zeichen kann die Methode GetDocument() verwendet werden. Bei größeren JSON-Nachrichten muss hingegen die Methode CopyDocument() verwendet werden.

fbJson.ResetDocument();
fbJson.StartObject();
fbjson.AddKeyDateTime('Timestamp', dtTimestamp);
fbJsonDataType.AddJsonKeyValueFromSymbol(fbJson, 'Values', 'ST_Values', SIZEOF(stValues), ADR(stValues));
fbJsonDataType.AddJsonKeyPropertiesFromSymbol(fbJson, 'MetaData', 'ST_Values', 'Unit|DisplayName');
fbJson.EndObject();
sJsonDoc := fbJson.GetDocument();
fbJson.CopyDocument(sJsonDoc2, SIZEOF(sJsonDoc2));

Resultierende JSON-Nachricht

{
  "Timestamp": "2017-04-04T12:42:42",
  "Values": {
    "Sensor1": 0.0,
    "Sensor2": 0,
    "Sensor3": 0
  },
  "MetaData": {
    "Sensor1": {
      "Unit": "m/s",
      "DisplayName": "Speed"
    },
    "Sensor2": {
      "Unit": "V",
      "DisplayName": "Voltage"
    },
    "Sensor3": {
      "Unit": "A",
      "DisplayName": "Current"
    }
  }
}

Alternative

Als Alternative kann auch die Methode AddJsonValueFromSymbol() verwendet werden, um aus einer Datenstruktur direkt ein JSON-Format zu erzeugen.

fbJson.ResetDocument();
fbJsonDataType.AddJsonValueFromSymbol(fbJson, 'ST_Values', SIZEOF(stValues), ADR(stValues));
sJsonDoc := fbJson.GetDocument();
fbJson.CopyDocument(sJsonDoc2, SIZEOF(sJsonDoc2));

Das resultierende JSON-Objekt sieht wie folgt aus:

{
  "Sensor1": 0.0,
  "Sensor2": 0,
  "Sensor3": 0
}

Konvertierung einer JSON-Nachricht zurück in eine Datenstruktur

Die obigen Beispiele zeigen, wie auf einfache Art und Weise aus einer Datenstruktur ein JSON‑Objekt erzeugt werden kann. Für den umgekehrten Weg, also das Extrahieren von Werten aus einem (empfangenen) JSON-Objekt zurück in eine Datenstruktur, gibt es ebenfalls eine entsprechende Methode in der Tc3_JsonXml-Bibliothek. Der Aufruf der Methode SetSymbolFromJson() ermöglicht diesen Anwendungsfall.

fbJsonDataType.SetSymbolFromJson(someJson, 'ST_Values', SIZEOF(stValuesReceive), ADR(stValuesReceive));

Die String-Variable sJsonDoc2 enthält das JSON-Objekt, das durch den Aufruf der Methode in die Strukturinstanz stValuesReceive überführt wird.

Tc3JsonXmlSampleJsonDataType 1:

Zieldatenstruktur

Die Zieldatenstruktur muss zum Aufbau des JSON-Dokuments passen. Ansonsten liefert SetSymbolFromJson() FALSE zurück.