Tc3JsonXmlSampleJsonDataType
Sample of the automatic conversion of structures into a JSON message
This sample illustrates how a data structure can be converted into a JSON message (and vice versa). In the conversion the layout of a structure is converted one-to-one into a corresponding JSON equivalent. Additional metadata can be created via PLC attributes on the member variables of the structure.
Layout of the data structure to be converted
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
Declaration range
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
Implementation range
Two ways of generating the JSON message are shown, starting with the instance fbJson of the function block FB_JsonSaxWriter. The GetDocument() method can be used with a JSON message with no more than 255 characters. However, the CopyDocument() method must be used with larger JSON messages.
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));
Resulting JSON message
{
"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
As an alternative, the method AddJsonValueFromSymbol() can also be used to generate a JSON format directly from a data structure.
fbJson.ResetDocument();
fbJsonDataType.AddJsonValueFromSymbol(fbJson, 'ST_Values', SIZEOF(stValues), ADR(stValues));
sJsonDoc := fbJson.GetDocument();
fbJson.CopyDocument(sJsonDoc2, SIZEOF(sJsonDoc2));
The resulting JSON object looks like this:
{
"Sensor1": 0.0,
"Sensor2": 0,
"Sensor3": 0
}
Conversion of a JSON message back to a data structure
The above samples show how a JSON object can be generated from a data structure in a simple manner. There is also a corresponding method in the Tc3_JsonXml library for the reverse process, i.e. the extraction of values from a (received) JSON object back into a data structure. This application is made possible by calling the method SetSymbolFromJson().
fbJsonDataType.SetSymbolFromJson(someJson, 'ST_Values', SIZEOF(stValuesReceive), ADR(stValuesReceive));
The string variable sJsonDoc2 contains the JSON object, which is transferred into the structure instance stValuesReceive by calling the method.
Target data structure The target data structure must match the structure of the JSON document. Otherwise SetSymbolFromJson() returns FALSE. |