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