Skip to main content

JSON Schemas

JSON is one of the most widely used data formats in modern systems. MAPS treats JSON as a first-class schema type, providing full validation, typing, transformation, and statistics support.


1. Format Overview​

JSON (JavaScript Object Notation) originated as a subset of JavaScript but quickly became the lingua franca of REST APIs, IoT payloads, logs, dashboards, and most modern messaging.

Common Characteristics​

  • Human-readable
  • Flexible
  • Extremely well-supported in every language
  • Perfect for telemetry, event logs, configs, and REST-style objects

Why Use JSON in MAPS?​

  • Easy to debug
  • Excellent for prototyping and rapid deployment
  • Converts cleanly to most other formats
  • Ideal for sensor and web-based sources

2. SchemaConfig for JSON​

All JSON schemas in MAPS are stored using a SchemaConfig object:


2.1 Required fields for JSON​

  • format → "json"
  • name → human-readable schema name
  • versionId → logical schema version
  • schema → unified JSON schema definition
  • labels.uniqueId → stable schema identifier

2.2 Example JSON SchemaConfig​

{
"versionId": "3",
"name": "bme688",
"format": "json",
"labels": {
"matchExpression": "/device/bme688",
"uniqueId": "bme688.v3",
"interface": "sensor",
"resource": "device",
"source": "manual"
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "BME688",
"description": "VOC, Humidity, Pressure and Temperature Module",
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "Optional ISO 8601 UTC timestamp (e.g., 2025-05-29T07:28:15.123Z)",
"readOnly": true
},
"temperature": {
"type": "number",
"minimum": -40.0,
"maximum": 85.0,
"x-precision": 1.0,
"description": "Unit: °C"
},
"humidity": {
"type": "number",
"minimum": 10.0,
"maximum": 90.0,
"x-precision": 1.0,
"description": "Unit: %RH"
},
"pressure": {
"type": "number",
"minimum": 300.0,
"maximum": 1100.0,
"x-precision": 1.0,
"description": "Unit: hPa"
},
"gas": {
"type": "number",
"minimum": 0.0,
"maximum": 65535.0,
"x-precision": 1.0,
"description": "Unit: Ω"
},
"heaterStatus": {
"type": "string",
"description": "Heater on or off"
},
"gasMode": {
"type": "string",
"description": "Current gas mode"
}
},
"required": [
"temperature",
"humidity",
"pressure",
"gas",
"heaterStatus",
"gasMode"
],
"additionalProperties": false
},
"schemaBase64": null
}

2.3 Notes​

  • JSON schemas use the standard MAPS unified schema model.
  • schemaBase64 must remain null for JSON formats.

3. Creating and Registering JSON Schemas​

3.1 Defining a JSON Schema​

Define:

  • fields
  • types
  • nested structures
  • arrays

3.2 Registering with MAPS​

  1. POST schema to Schema Repository
  2. Repository validates it
  3. Schema stored with unique ID
  4. Bind schema → topic/context

3.3 Using JSON Schemas in Java​

MAPS:

  • loads schema
  • parses payload into a Typed Event
  • validates types
  • provides type-safe field access
    JsonSchemaConfig config = new JsonSchemaConfig();
config.setComments("Air Quality Breakout");
config.setTitle("BME688");
config.setVersion(3);
config.setResourceType("sensor");
config.setUniqueId("BME688.v3");
config.setInterfaceDescription("Air Quality Breakout");
config.setSchema(getSchema());
return config;

4. JSON in the MAPS Pipeline​

JSON → Typed Event is efficient and reliable:

  • Supports nested objects
  • Supports arrays
  • Excellent for selectors
  • Excellent for transformations
  • Ideal for statistics
  • Ideal for format conversion

Common pipelines:

  • JSON → CBOR / MessagePack
  • JSON → Avro / Protobuf

5. Compatibility & Mapping Notes​

Maps cleanly to:​

  • Protobuf
  • Avro
  • CBC
  • CSV - ( no nested objects, dates will become strings)
  • CBOR
  • MessagePack
  • XML

Weak spots:​

  • Binary data becomes base64
  • No enum type
  • Loses precision for very large numbers

6. Warnings & Best Practices​

1. Timestamps must be consistent​

Use ISO-8601 or epoch millis.

2. Numbers are ambiguous in vanilla JSON​

MAPS schema fixes this, but producers must still send proper types.

3. Avoid inconsistent shapes​

Missing or shifting fields cause validation failures.

4. Binary must be base64​

JSON cannot represent byte arrays natively.

5. Deeply nested JSON is CPU-heavy​

For high-volume telemetry, use Avro, Protobuf, or CBC.