Einführung in das JSON-Schema in Java

1. Übersicht

JSON-Schema ist eine deklarative Sprache zum Überprüfen des Formats und der Struktur eines JSON-Objekts . Hier können wir die Anzahl der speziellen Grundelemente angeben, um genau zu beschreiben, wie ein gültiges JSON-Objekt aussehen wird.

Die JSON-Schemaspezifikation ist in drei Teile unterteilt:

  • JSON-Schemakern: In der JSON-Schemakernspezifikation wird die Terminologie für ein Schema definiert.
  • JSON-Schema-Validierung: Die JSON-Schema-Validierungsspezifikation ist das Dokument, das die gültigen Methoden zum Definieren von Validierungsbeschränkungen definiert. In diesem Dokument wird auch eine Reihe von Schlüsselwörtern definiert, mit denen Validierungen für eine JSON-API angegeben werden können. In den folgenden Beispielen werden einige dieser Schlüsselwörter verwendet.
  • JSON-Hyperschema: Dies ist eine weitere Erweiterung der JSON-Schema-Spezifikation, in der der Hyperlink und die Schlüsselwörter für Hypermedien definiert sind.

2. Definieren eines JSON-Schemas

Nachdem wir definiert haben, wofür ein JSON-Schema verwendet wird, erstellen wir ein JSON-Objekt und das entsprechende JSON-Schema , das es beschreibt.

Das folgende ist ein einfaches JSON-Objekt, das einen Produktkatalog darstellt:

{ "id": 1, "name": "Lampshade", "price": 0 }

Wir könnten das JSON-Schema wie folgt definieren:

{ "$schema": "//json-schema.org/draft-04/schema#", "title": "Product", "description": "A product from the catalog", "type": "object", "properties": { "id": { "description": "The unique identifier for a product", "type": "integer" }, "name": { "description": "Name of the product", "type": "string" }, "price": { "type": "number", "minimum": 0, "exclusiveMinimum": true } }, "required": ["id", "name", "price"] }

Wie wir sehen können, ist ein JSON-Schema ein JSON-Dokument , und dieses Dokument MUSS ein Objekt sein. Vom JSON-Schema definierte Objektelemente (oder Eigenschaften) werden als Schlüsselwörter bezeichnet .

Lassen Sie uns die Schlüsselwörter erklären, die wir in unserem Beispiel verwendet haben:

  • Das Schlüsselwort $ schema gibt an, dass dieses Schema gemäß dem Entwurf der v4-Spezifikation geschrieben wurde.
  • Die Schlüsselwörter title und description sind nur insofern beschreibend, als sie den zu validierenden Daten keine Einschränkungen hinzufügen. Die Absicht des Schemas wird mit diesen beiden Schlüsselwörtern angegeben: beschreibt ein Produkt.
  • Das Schlüsselwort type definiert die erste Einschränkung für unsere JSON- Daten: Es muss ein JSON-Objekt sein .

Ein JSON-Schema kann auch Eigenschaften enthalten, die keine Schema-Schlüsselwörter sind. In unserem Fall sind ID , Name und Preis Mitglieder (oder Eigenschaften) des JSON-Objekts .

Für jede Eigenschaft können wir den Typ definieren . Wir haben ID und Name als Zeichenfolge und Preis als Nummer definiert . Im JSON-Schema kann eine Anzahl ein Minimum haben. Standardmäßig ist dieses Minimum inklusive, daher müssen wir exklusives Minimum angeben .

Schließlich ist das Schema sagt , dass die ID , Name und Preis sind erforderlich .

3. Validierung mit JSON-Schema

Mit unserem JSON Schema in Kraft gesetzt können wir bestätigen unser JSON - Objekt .

Es gibt viele Bibliotheken, um diese Aufgabe zu erfüllen. In unserem Beispiel haben wir die Java-JSON-Schema-Bibliothek ausgewählt.

Zunächst müssen wir unserer pom.xml die folgende Abhängigkeit hinzufügen :

 org.everit.json org.everit.json.schema 1.3.0  

Schließlich können wir einige einfache Testfälle schreiben, um unser JSON-Objekt zu validieren :

@Test public void givenInvalidInput_whenValidating_thenInvalid() throws ValidationException { JSONObject jsonSchema = new JSONObject( new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json"))); JSONObject jsonSubject = new JSONObject( new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_invalid.json"))); Schema schema = SchemaLoader.load(jsonSchema); schema.validate(jsonSubject); }

In diesem Fall zeigt die ausgelöste ValidationException auf # / price. Wenn Sie sich die Konsole ansehen, wird die folgende Ausgabe gedruckt:

#/price: 0.0 is not higher than 0 

Der zweite Test sieht folgendermaßen aus:

@Test public void givenValidInput_whenValidating_thenValid() throws ValidationException { JSONObject jsonSchema = new JSONObject( new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json"))); JSONObject jsonSubject = new JSONObject( new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_valid.json"))); Schema schema = SchemaLoader.load(jsonSchema); schema.validate(jsonSubject); }

Da wir ein gültiges JSON-Objekt verwenden , wird kein Validierungsfehler ausgelöst.

4. Fazit

In diesem Artikel haben wir definiert, was ein JSON-Schema ist und welche relevanten Schlüsselwörter uns bei der Definition unseres Schemas helfen.

Durch Koppeln eines JSON-Schemas mit der entsprechenden JSON-Objektdarstellung können wir eine Validierungsaufgabe ausführen.

Ein einfacher Testfall dieses Artikels finden Sie im GitHub-Projekt.