JSON Daten überprüfen mit JSON Schema

2 Min Lesezeit CC BY-ND 4.0 open-source calendarbot data deno nodejs typescript web

Bei meinem Kalenderbot können zusätzliche Veranstaltungen, wie Tutorien, hinzugefügt werden. Das passiert über JSON Dateien in einem öffentlichen Git Repository, auf das alle Pull Requests stellen können. Das Download Tool holt sich dann regelmäßig die aktuellen JSON Dateien und pflegt diese mit in die Kalenderdateien vom Kalenderbot ein. Um sicherzustellen, dass diese Daten auch im richtigen Format vorliegen, habe ich JSON Schema verwendet.

JSON Schema beschreibt das Format von JSON Dateien. Damit werden dann beliebig viele JSON Daten geprüft, in meinem Fall alle zusätzlichen Kalendereinträge.

Als Beispiel eine typische Veranstaltung, danach das JSON Schema, welches die Veranstaltung verifiziert.

{
  "year": 2022,
  "month": 7,
  "date": 14,
  "name": "CaDS-JourFixe",
  "starttime": "12:00",
  "endtime": "12:30",
  "room": "287"
}
const eventSchema = {
  type: "object",
  properties: {
    name: { type: "string" },
    room: { type: "string" },
    starttime: { type: "string", pattern: "^[12]?\\d:\\d\\d" },
    endtime: { type: "string", pattern: "^[12]?\\d:\\d\\d" },
    date: { type: "integer", minimum: 1, maximum: 31 },
    month: { type: "integer", minimum: 1, maximum: 12 },
    year: { type: "integer", minimum: 2015, maximum: 2100 },
  },
  required: ["name", "room", "starttime", "endtime", "date", "month", "year"],
  additionalProperties: false,
};

Das fertige JSON Schema ist relativ selbsterklärend. In diesem Fall ist es ein JSON object. In diesem Objekt stehen properties, welche Keys mit ebenfalls wieder JSON Typen enthalten. Ein einfacher Typ ist der Wert von name, welches irgendein string ist. Spannender wird die starttime und endtime, welche ein pattern, also einen regulären Ausdruck, erfüllen müssen. Zuletzt kommen Tag, Monat und Jahr, welches Ganzzahlen mit minimum und maximum sind. Alle Keys sind required und es darf keine zusätzlichen properties geben.

Das Ganze habe ich mittels Deno und TypeScript und ajv zum Validieren umgesetzt. Ein kurzer Vergleich zwischen Node.js und Deno führte dazu, dass Deno in der CI deutlich schneller als Node.js fertig war und so nutze ich für dieses relativ einfache Script Deno.

Nun werden bei jedem Push die JSON Dateien geprüft und ich kann mir sicher sein, dass diese später korrekt gelesen werden können.