GET JSON Functional Keyword
| Feature | Since Version | Notes |
|---|---|---|
GET JSON |
>v1.6.0 | Extracts fields from JSON payloads with type casting |
Overview
- Description:
Extracts specific fields from JSON-formatted data with explicit type casting. Essential for processing JSON payloads in Actions and working with
PUBLISH MODEL. Supports nested field access using dot notation.
Signature
- Syntax:
Parameters
"<field_name>": The JSON field to extract. Supports dot notation for nested fields (e.g.,"parent.child.field")<source>: The JSON data source. TypicallyPAYLOADor a{variable}containing JSON<TYPE>: Required type casting. One of:AS STRING- Extract as textAS DOUBLE- Extract as decimal numberAS INT- Extract as integerAS BOOL- Extract as boolean
Return Value
- Description:
Returns the extracted field value converted to the specified type. Returns
EMPTYif the field doesn't exist.
Usage Examples
Basic Example: Extract Single Field
DEFINE ACTION ProcessTemperature
ON TOPIC "sensors/json" DO
SET "temp" WITH (GET JSON "temperature" IN PAYLOAD AS DOUBLE)
PUBLISH TOPIC "sensors/temperature" WITH {temp}
Test:
Intermediate Example: Multiple Field Extraction
DEFINE ACTION ExtractSensorData
ON TOPIC "sensors/+/data" DO
SET "sensor_id" WITH TOPIC POSITION 1
// Extract multiple fields
SET "temperature" WITH (GET JSON "temperature" IN PAYLOAD AS DOUBLE)
SET "humidity" WITH (GET JSON "humidity" IN PAYLOAD AS DOUBLE)
SET "status" WITH (GET JSON "status" IN PAYLOAD AS STRING)
SET "active" WITH (GET JSON "is_active" IN PAYLOAD AS BOOL)
// Publish to separate topics
PUBLISH TOPIC "sensors/" + {sensor_id} + "/temperature" WITH {temperature}
PUBLISH TOPIC "sensors/" + {sensor_id} + "/humidity" WITH {humidity}
PUBLISH TOPIC "sensors/" + {sensor_id} + "/status" WITH {status}
Advanced Example: Nested Field Access
DEFINE ACTION ProcessNestedJSON
ON TOPIC "devices/+/telemetry" DO
SET "device_id" WITH TOPIC POSITION 1
// Extract nested fields using dot notation
SET "temp" WITH (GET JSON "sensors.temperature.value" IN PAYLOAD AS DOUBLE)
SET "temp_unit" WITH (GET JSON "sensors.temperature.unit" IN PAYLOAD AS STRING)
SET "location" WITH (GET JSON "metadata.location.name" IN PAYLOAD AS STRING)
SET "firmware" WITH (GET JSON "system.firmware.version" IN PAYLOAD AS STRING)
PUBLISH TOPIC "devices/" + {device_id} + "/summary" WITH "Device at " + {location} + " reports " + {temp} + " " + {temp_unit}
Test:
Publish to: devices/dev001/telemetry
Payload: {
"sensors": {
"temperature": {
"value": 22.5,
"unit": "celsius"
}
},
"metadata": {
"location": {
"name": "Factory Floor A"
}
},
"system": {
"firmware": {
"version": "2.1.0"
}
}
}
Result: "Device at Factory Floor A reports 22.5 celsius"
Advanced Example: With PUBLISH MODEL
DEFINE MODEL SensorDataRecord COLLAPSED
ADD STRING "sensor_id"
ADD STRING "sensor_type"
ADD DOUBLE "temperature"
ADD DOUBLE "pressure"
ADD DOUBLE "humidity"
ADD STRING "quality_status"
ADD STRING "timestamp"
DEFINE ACTION ProcessCompleteSensorData
ON TOPIC "sensors/+/complete_data" DO
SET "sensor_id" WITH TOPIC POSITION 1
// Extract all fields from JSON
SET "sensor_type" WITH (GET JSON "type" IN PAYLOAD AS STRING)
SET "temperature_val" WITH (GET JSON "readings.temperature" IN PAYLOAD AS DOUBLE)
SET "pressure_val" WITH (GET JSON "readings.pressure" IN PAYLOAD AS DOUBLE)
SET "humidity_val" WITH (GET JSON "readings.humidity" IN PAYLOAD AS DOUBLE)
SET "quality" WITH (GET JSON "quality.status" IN PAYLOAD AS STRING)
// Publish structured record
PUBLISH MODEL SensorDataRecord TO "sensors/validated/" + {sensor_id} WITH
sensor_id = {sensor_id}
sensor_type = {sensor_type}
temperature = {temperature_val}
pressure = {pressure_val}
humidity = {humidity_val}
quality_status = {quality}
timestamp = TIMESTAMP WITH "UTC"
Type Casting Details
STRING
Converts any value to text format:
GET JSON "count" IN PAYLOAD AS STRING // 123 becomes "123"
GET JSON "active" IN PAYLOAD AS STRING // true becomes "true"
INT
Converts to integer (truncates decimals):
GET JSON "temperature" IN PAYLOAD AS INT // 25.7 becomes 25
GET JSON "count" IN PAYLOAD AS INT // "42" becomes 42
DOUBLE
Converts to floating-point number:
GET JSON "temperature" IN PAYLOAD AS DOUBLE // "25.5" becomes 25.5
GET JSON "ratio" IN PAYLOAD AS DOUBLE // 0.75 stays 0.75
BOOL
Converts to boolean (true/false):
GET JSON "is_active" IN PAYLOAD AS BOOL // true, "true", 1 become TRUE
GET JSON "enabled" IN PAYLOAD AS BOOL // false, "false", 0 become FALSE
Error Handling
Check for Missing Fields
DEFINE ACTION SafeExtraction
ON TOPIC "data/json" DO
SET "value" WITH (GET JSON "optional_field" IN PAYLOAD AS STRING)
IF {value} EQUALS EMPTY THEN
SET "value" WITH "DEFAULT_VALUE"
PUBLISH TOPIC "data/processed" WITH {value}
Validate Extracted Data
DEFINE ACTION ValidateExtractedData
ON TOPIC "sensors/json" DO
SET "temp" WITH (GET JSON "temperature" IN PAYLOAD AS DOUBLE)
IF {temp} EQUALS EMPTY THEN
PUBLISH TOPIC "errors/parsing" WITH "Temperature field missing"
ELSE IF {temp} < -50 OR {temp} > 150 THEN
PUBLISH TOPIC "errors/validation" WITH "Temperature out of range: " + {temp}
ELSE
PUBLISH TOPIC "sensors/valid_temperature" WITH {temp}
Common Patterns
Pattern 1: Extract, Validate, Publish Model
DEFINE MODEL ValidatedReading COLLAPSED
ADD STRING "sensor_id"
ADD DOUBLE "value"
ADD BOOL "valid"
ADD STRING "timestamp"
DEFINE ACTION ExtractValidatePublish
ON TOPIC "sensors/+/raw" DO
SET "sensor_id" WITH TOPIC POSITION 1
SET "value" WITH (GET JSON "reading" IN PAYLOAD AS DOUBLE)
SET "is_valid" WITH ({value} >= 0 AND {value} <= 100)
PUBLISH MODEL ValidatedReading TO "sensors/validated/" + {sensor_id} WITH
sensor_id = {sensor_id}
value = {value}
valid = {is_valid}
timestamp = TIMESTAMP "UTC"
Pattern 2: Extract from Python Result
DEFINE ACTION ProcessWithPython
ON TOPIC "data/process" DO
CALL PYTHON "DataProcessor.analyze"
WITH (PAYLOAD)
RETURN AS {result}
SET "score" WITH (GET JSON "quality_score" IN {result} AS DOUBLE)
SET "status" WITH (GET JSON "status" IN {result} AS STRING)
SET "passed" WITH (GET JSON "validation.passed" IN {result} AS BOOL)
PUBLISH TOPIC "data/quality_score" WITH {score}
PUBLISH TOPIC "data/status" WITH {status}
Notes & Additional Information
- Always use type casting (
AS TYPE) - it's required and prevents errors - Supports deep nested access with dot notation:
"level1.level2.level3" - Returns
EMPTYif field doesn't exist in the JSON - Works with JSON from
PAYLOAD,GET TOPIC, or Python return values - Case-sensitive field names
- Array indexing not directly supported (extract array as OBJECT and process separately)