[JAVA] Validierung von JSON mit JSON-Schema

Wenn Sie Daten im JSON-Format haben, möchten Sie möglicherweise überprüfen, ob die Daten nach vorgegebenen Regeln geschrieben wurden. Zu diesem Zweck wurde ein Standard namens JSON-Schema entwickelt.

Was ist ein JSON-Schema?

Betrachten Sie als Beispiel die folgenden JSON-formatierten Daten.

person.json


{
    "name": "Yamada Taro",
    "age": 42,
    "hobbies": ["Baseball", "Judo"]
}

Im JSON-Schema werden solche JSON-formatierten Daten, die einer Validierung unterliegen, als JSON-Instanz bezeichnet. Hier möchten wir die folgenden Einschränkungen für die obige JSON-Instanz festlegen, die "Person" darstellt.

Das JSON-Schema drückt solche Einschränkungen wie folgt aus: Das JSON-Schema selbst ist ebenfalls im JSON-Format geschrieben.

json:person.schema.json


{
    "type": "object",
    "properties": {
        "name": {
            "type": "string"
        },
        "age": {
            "type": "integer",
            "minimum": 0
        },
        "hobbies": {
            "type": "array",
            "items": {
                "type": "string"
            }
        }
    },
    "required": ["name"]
}

Die JSON-Schemaspezifikation wird von json-schema-org entwickelt. Die neueste Spezifikation zum Zeitpunkt des Schreibens dieses Artikels ist Draft-07.

Versuchen Sie, JSON zu validieren

Lassen Sie uns nun die JSON-Instanz gemäß dem JSON-Schema validieren. Der folgende Code ist in Java geschrieben.

In diesem Artikel verwenden wir Justify als Bibliothek für die JSON-Validierung. Diese Bibliothek verwendet die Schnittstelle des Pakets "javax.json", das von [Java-API für JSON-Verarbeitung (JSR 374)] bereitgestellt wird, wie zum Laden von JSON-Instanzen. Aus diesem Grund müssen API-Benutzer nicht unbedingt wissen, dass sie validieren.

Vorbereitung

Fügen Sie der zu validierenden Java-Anwendung die folgenden zwei Dateien als abhängige Dateien hinzu. Dies ist ein Beispiel, wenn Maven als Build-Tool verwendet wird.

pom.xml


<!--Bibliothekskörper-->
<dependency>
  <groupId>org.leadpony.justify</groupId>
  <artifactId>justify</artifactId>
  <version>2.0.0</version>
</dependency>

<!--Implementierung der Java API für die JSON-Verarbeitung-->
<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>jakarta.json</artifactId>
  <classifier>module</classifier>
  <version>1.1.6</version>
</dependency>

Die zweite Abhängigkeitsdatei ist ein Beispiel für die Verwendung der Referenzimplementierung als Implementierung der [Java-API für die JSON-Verarbeitung (JSR 374)]. Es ist sicher, es durch eine andere kompatible Implementierung wie Apache Johnzon zu ersetzen.

Validierung mit Streaming-API

In [Java-API für JSON-Verarbeitung (JSR 374)] gibt es zwei Arten von APIs: Streaming-API und Objektmodell-API. Lassen Sie uns zunächst die JSON-Instanz mithilfe der Streaming-API überprüfen.

In der Streaming-API wird die Steuerung in Einheiten kleiner Ereignisse, die beim Lesen von JSON auftreten, wie z. B. dem Beginn eines Objekts, dem Namen einer Eigenschaft, dem Wert einer Eigenschaft usw., an den Aufrufer zurückgegeben. Verwenden Sie die Schnittstelle javax.json.stream.JsonParser, um die JSON-Instanz zu laden.

import java.nio.file.Paths;
import javax.json.stream.JsonParser;
import org.leadpony.justify.api.JsonSchema;
import org.leadpony.justify.api.JsonValidationService;
import org.leadpony.justify.api.ProblemHandler;

//Erstellen Sie einen Validierungsservice.
JsonValidationService service = JsonValidationService.newInstance();
//Lesen Sie das JSON-Schema aus der Datei.
JsonSchema schema = service.readSchema(Paths.get("person.schema.json"));
//Ein Handler, der Probleme behandelt, die während der Validierung festgestellt wurden.
//Hier nur Ausgabe auf Standardausgabe.
ProblemHandler handler = service.createProblemPrinter(System.out::println);

//Erstellen Sie einen Parser zum Lesen der JSON-Instanz.
try (JsonParser parser = service.createParser(Paths.get("person.json"), schema, handler)) {
    //Behandeln Sie alle Parser-Ereignisse
    while (parser.hasNext()) {
        //Parser-Ereignis, das aufgetreten ist
        JsonParser.Event event = parser.next();
        //Ereignisse behandeln.
        doSomethingUseful(event);
    }
}

Versuchen Sie als Test, eine ungültige JSON-Instanz wie folgt einzugeben.

person-bad.json


{
    "age": -1,
    "hobbies": ["Baseball", "Judo"]
}

Während der Validierung festgestellte Probleme werden wie folgt ausgegeben:

[2 Zeilen,13 Reihen]Die Zahl muss größer oder gleich 0 sein.
[4 Zeilen,1 Reihe]Objekt ist eine Eigenschaft"name"Haben müssen.

Wenn das Laufzeitgebietsschema japanisch ist, lautet die Fehlermeldung ebenfalls japanisch.

Validierung mit Objektmodell-API

Schauen wir uns als nächstes ein Codebeispiel mit der Objektmodell-API an.

In der Objektmodell-API wird beim Lesen eines JSON das gesamte JSON-Objekt oder -Array im Speicher erstellt. Verwenden Sie die Schnittstelle javax.json.JsonReader, um die JSON-Instanz zu laden.

import java.nio.file.Paths;
import javax.json.JsonObject;
import javax.json.JsonReader;
import org.leadpony.justify.api.JsonSchema;
import org.leadpony.justify.api.JsonValidationService;
import org.leadpony.justify.api.ProblemHandler;

//Erstellen Sie einen Validierungsservice.
JsonValidationService service = JsonValidationService.newInstance();
//Lesen Sie das JSON-Schema aus der Datei.
JsonSchema schema = service.readSchema(Paths.get("person.schema.json"));
//Ein Handler, der Probleme behandelt, die während der Validierung festgestellt wurden.
//Hier nur Ausgabe auf Standardausgabe.
ProblemHandler handler = service.createProblemPrinter(System.out::println);

//Erstellen Sie einen Reader zum Lesen der JSON-Instanz.
try (JsonReader reader = service.createReader(Paths.get("person.json"), schema, handler)) {
    //Lesen Sie ein JSON-Objekt
    JsonObject object = reader.readObject();
    //Verarbeiten Sie das gelesene JSON-Objekt.
    doSomethingUseful(object);
}

Selbst im Fall der Objektmodell-API wird eine Fehlermeldung ausgegeben, die der Streaming-API ähnelt, wenn in der JSON-Instanz ein Problem gefunden wird.

Validierung mit Bindungs-API

Java hat [Java-API für JSON-Bindung (JSR 367)] als API-Spezifikation für die direkte Konvertierung einer JSON-Instanz in POJO (Plain Old Java Object). Lassen Sie uns abschließend eine JSON-Instanz mithilfe dieser API validieren.

Da wir Yasson als Implementierung von Java API for JSON Binding (JSR 367) verwenden, fügen Sie dies als abhängige Datei hinzu.

pom.xml


<!--Implementierung der Java-API für die JSON-Bindung-->
<dependency>
  <groupId>org.eclipse</groupId>
  <artifactId>yasson</artifactId>
  <version>1.0.2</version>
</dependency>

Definieren Sie als Nächstes die Klasse "Person" als Ziel-POJO.

public class Person {
    public String name;
    public int age;
    public List<String> hobbies;
}

Der Validierungscode sieht folgendermaßen aus:

import java.nio.file.Paths;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.spi.JsonProvider;
import org.leadpony.justify.api.JsonSchema;
import org.leadpony.justify.api.JsonValidationService;

//Erstellen Sie einen Validierungsservice.
JsonValidationService service = JsonValidationService.newInstance();
//Lesen Sie das JSON-Schema aus der Datei.
JsonSchema schema = service.readSchema(Paths.get("person.schema.json"));
//Erstellen Sie eine Instanz von JsonProvider.
JsonProvider provider = service.createJsonProvider(
        schema, 
        parser->service.createProblemPrinter(System.out::println));
//Erstellen Sie eine Instanz von Jsonb.
Jsonb jsonb = JsonbBuilder.newBuilder().withProvider(provider).build();

//Öffnen Sie eine JSON-Instanz als Eingabestream.
try (InputStream stream = Files.newInputStream(Paths.get("person.json"))) {
    //Konvertieren Sie eine JSON-Instanz in ein Personenobjekt.
    Person person = jsonb.fromJson(stream, Person.class);
    //Verarbeiten Sie das Personenobjekt.
    doSomethingUseful(person);
}

Ähnlich wie bei dem bisher eingeführten Code wird eine Fehlermeldung gedruckt, wenn in der von Ihnen eingegebenen JSON-Instanz ein Problem gefunden wird.

Andere Implementierungen variabler Daten

Für JSON-Validatoren, die auf der JSON-Schemaspezifikation basieren, finden Sie die neueste Liste in [Implementierungen] auf json-schema.org, auch für andere Programmiersprachen als Java. Das in diesem Artikel vorgestellte [Begründen] wurde von mir selbst entwickelt.

Recommended Posts

Validierung von JSON mit JSON-Schema
Anders als bei JSON
Importieren Sie JSON mit SolrJ
Behandeln Sie JSON mit minimal-json
Selbstgemachte Validierung mit Spring
Formatieren Sie JSON mit org.json
Prozessvalidierungsnachricht mit Decorator
[Java] JSON-Kommunikation mit Jackson
Erhalten Sie Validierungsergebnisse mit Spring Boot
Bean Validation mit Micronaut (Java) hinzufügen
Einfache Eingabeprüfung mit Bean Validation!
Behandeln Sie JSON mühelos mit Alamofires Antwort Json
Wenden Sie den Matching-Prozess für reguläre Ausdrücke mit JSON Sassert an
Erstellen Sie Ihren eigenen Validator mit Bean Validation
So implementieren Sie TextInputLayout mit Validierungsfunktion
Behandeln Sie große JSON mit Java Lambda
Formularklassenvalidierungstest mit Spring Boot
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON