Tc3JsonXmlSampleJsonDomReader

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

Deklarationsbereich

PROGRAM MAIN
VAR
  fbJson     : FB_JsonDomParser;
  jsonDoc    : SJsonValue;
  jsonProp   : SJsonValue;
  jsonValue  : SJsonValue;
  bHasMember : BOOL;
  sMessage   : STRING(255) := '{"serialNumber":"G030PT028191AC4R","batteryVoltage":"1547mV","clickType":"SINGLE"}';
  stReceivedData : ST_ReceivedData;
END_VAR

Implementierungsbereich

Durch die Methode ParseDocument() wird die JSON-Nachricht in den DOM-Tree geladen. Anschließend kann mit der Methode HasMember() überprüft werden, ob ein bestimmtes Property enthalten ist. Über die Methode FindMember() wird das Property selektiert und über GetString() dessen Value extrahiert.

jsonDoc := fbJson.ParseDocument(sMessage);
bHasMember := fbJson.HasMember(jsonDoc, 'serialNumber');
IF (bHasMember) THEN
  bHasMember := FALSE;
  jsonProp := fbJson.FindMember(jsonDoc, 'serialNumber');
  stReceivedData.serialNumber := fbJson.GetString(jsonProp);
END_IF

bHasMember := fbJson.HasMember(jsonDoc, 'batteryVoltage');
IF (bHasMember) THEN
  bHasMember := FALSE;
  jsonProp := fbJson.FindMember(jsonDoc, 'batteryVoltage');
  stReceivedData.batteryVoltage := fbJson.GetString(jsonProp);
END_IF

bHasMember := fbJson.HasMember(jsonDoc, 'clickType');
IF (bHasMember) THEN
  bHasMember := FALSE;
  jsonProp := fbJson.FindMember(jsonDoc, 'clickType');
  stReceivedData.clickType := fbJson.GetString(jsonProp);
END_IF

Die Verwendung der Methode HasMember() ist nicht zwingend erforderlich, da die Methode FindMember() bereits 0 zurückliefert, wenn ein Property nicht gefunden wurde. Der oben dargestellte Code kann also auch wie folgt implementiert werden:

jsonDoc := fbJson.ParseDocument(sMessage);

jsonProp := fbJson.FindMember(jsonDoc, 'serialNumber');
IF (jsonProp <> 0) THEN
  stReceivedData.serialNumber := fbJson.GetString(jsonProp);
END_IF

jsonProp := fbJson.FindMember(jsonDoc, 'batteryVoltage');
IF (jsonProp <> 0) THEN
  stReceivedData.batteryVoltage := fbJson.GetString(jsonProp);
END_IF

jsonProp := fbJson.FindMember(jsonDoc, 'clickType');
IF (jsonProp <> 0) THEN
  stReceivedData.clickType := fbJson.GetString(jsonProp);
END_IF

Verschachtelte JSON-Objekte

Bei verschachtelten JSON-Objekten ist die Herangehensweise ähnlich. Dadurch, dass sich das gesamte Dokument im DOM befindet, kann darin einfach navigiert werden. Gegeben sei ein JSON-Objekt, das sich wie folgt darstellt:

sMessage : STRING(255) := '{"Values":{"serial":"G030PT028191AC4R"}}';

Das gesuchte Property befindet sich in dem Unterobjekt „Values“. Der folgende Code zeigt, wie das Property extrahiert werden kann.

jsonDoc := fbJson.ParseDocument(sMessage);
bHasMember := fbJson.HasMember(jsonDoc, 'Values');
IF (bHasMember) THEN
  bHasMember := FALSE;
  jsonProp := fbJson.FindMember(jsonDoc, 'Values');
  IF jsonProp <> 0 THEN
    jsonSerial := fbJson.FindMember(jsonProp, 'serial');
    stReceivedData.serialNumber := fbJson.GetString(jsonSerial);
  END_IF
END_IF