Skip to content

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:
    GET JSON "<field_name>" IN <source> AS <TYPE>
    

Parameters

  • "<field_name>": The JSON field to extract. Supports dot notation for nested fields (e.g., "parent.child.field")
  • <source>: The JSON data source. Typically PAYLOAD or a {variable} containing JSON
  • <TYPE>: Required type casting. One of:
    • AS STRING - Extract as text
    • AS DOUBLE - Extract as decimal number
    • AS INT - Extract as integer
    • AS BOOL - Extract as boolean

Return Value

  • Description: Returns the extracted field value converted to the specified type. Returns EMPTY if 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:

Publish to: sensors/json
Payload: {"temperature": 25.5, "humidity": 60}

Result: temp = 25.5

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 EMPTY if 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)