Skip to content

Schema Registry Example - JSON Schema

This page demonstrates how to register a draft 2020-12 JSON Schema in Schema Registry and use the schema_check function in a rule to validate MQTT message payloads. The example republishes only payloads that conform to the schema.

Supported JSON Schema Drafts

Starting from EMQX 6.0.4, Schema Registry supports the following JSON Schema drafts:

  • draft-03
  • draft-04
  • draft-06
  • draft 2019-09
  • draft 2020-12

EMQX selects the JSON Schema version based on the value of the $schema field. If $schema is omitted, EMQX uses draft-06.

Support for draft 2019-09 and draft 2020-12 has the following limitations:

  • Draft 2019-09 does not support $recursiveRef.
  • Draft 2020-12 does not support $dynamicRef.
  • References to remote schemas are not supported for these two drafts.

If a schema uses an unsupported keyword, validation returns an error instead of silently ignoring the keyword.

Create a JSON Schema

Create a schema that accepts an array containing exactly two integers:

  1. In the EMQX Dashboard, click Smart Data Hub -> Schema Registry in the left navigation menu.

  2. On the Internal tab, click Create.

  3. Configure the following fields:

    • Name: Enter json_array.

    • Type: Select JSON Schema.

    • Schema: Enter the following draft 2020-12 schema:

      json
      {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "array",
        "prefixItems": [
          { "type": "integer" },
          { "$ref": "#/prefixItems/0" }
        ],
        "minItems": 2,
        "maxItems": 2
      }
  4. Click Create.

The prefixItems array defines the schema for each position. The local $ref makes the second item use the same integer schema as the first item. minItems and maxItems require the payload to contain exactly two items.

Create a Rule

Create a rule that republishes messages only when the payload conforms to json_array:

  1. In the Dashboard, click Integration -> Rules in the left navigation menu.

  2. On the Rules page, click Create.

  3. Enter validate_json_array in the Name field.

  4. Enter the following statement in the SQL Editor:

    sql
    SELECT *
    FROM "t/json"
    WHERE schema_check('json_array', payload)

    The schema_check function returns true when the payload conforms to json_array. Otherwise, it returns false, and the rule does not execute its action.

  5. Click Add Action, and select Republish.

  6. Enter validated/json in the Topic field and ${payload} in the Payload field.

  7. Click Create.

Test the Rule

Use MQTTX CLI to verify the rule:

  1. Subscribe to the republish topic:

    bash
    mqttx sub -t validated/json
  2. In another terminal, publish a payload that conforms to the schema:

    bash
    mqttx pub -t t/json -m '[1, 2]'

    The subscriber receives [1, 2] from the validated/json topic.

  3. Publish a payload whose second item is not an integer:

    bash
    mqttx pub -t t/json -m '[1, "two"]'

    The rule does not execute the republish action, and the subscriber receives no message.

Using schema_check in a rule filters rule execution but does not reject the original MQTT message. To reject or discard nonconforming messages, use Schema Validation.