In Java spielt JSON, also die JavaScript-Objektnotation, eine sehr wichtige Rolle bei der Manipulation serverseitiger Antworten. In Java können wir JSON-Dokumente anhand eines JSON-Schemas validieren. Um die Validierung durchzuführen, verwenden wir die networknt JSON Schema-Validator Bibliothek.
Der Grund für die Verwendung dieser Bibliothek besteht darin, dass sie Jackson als JSON-Bibliothek verwendet und die neueste JSON-Schema-Version unterstützt. Die Netzwerkbibliothek ist eine Java Implementierung der Spezifikation JSON Schema Core Draft v4, v6, v7 und v2019-09 (die wir in unserem Beispiel verwenden) für die JSON-Schemavalidierung. Es hat Jackson als Standard-JSON-Parser.
Zunächst nehmen wir ein Beispiel für ein JSON-Dokument und ein JSON-Schema, die wir in unserem Programm zur Durchführung der Validierung verwenden.
JSON-Dokument
{ 'name': 'Emma Watson', 'artist': 'Paul Walker', 'description': null, 'tags': ['oil', 'famous'] }
JSON-Schema
{ '$schema': 'https://json-schema.org/draft/2019-09/schema#', '$id+': 'http://my-paintings-api.com/schemas/painting-schema.json', 'type': 'object', 'title': 'Painting', 'description': 'Painting information', 'additionalProperties': true, 'required': ['name', 'artist', 'description', 'tags'], 'properties': { 'name': { 'type': 'string', 'description': 'Painting name' }, 'artist': { 'type': 'string', 'maxLength': 50, 'description': 'Name of the artist' }, 'description': { 'type': ['string', 'null'], 'description': 'Painting description' }, 'tags': { 'type': 'array', 'items': { '$ref': '#/$defs/tag' } } }, '$defs': { 'tag': { 'type': 'string', 'enum': ['oil', 'watercolor', 'digital', 'famous'] } } }
Wir fügen die folgende Abhängigkeit in unsere pom.xml-Datei ein.
com.networknt json-schema-validator 1.0.42
Wir können auch die verwenden org.everit.json Bibliothek zur Validierung des JSON-Objekts. Um es zu verwenden, müssen wir die folgende Abhängigkeit in unserer pom.xml-Datei hinzufügen:
org.everit.json org.everit.json.schema 1.11.1
In unserem Fall verwenden wir die Netzwerknt Bibliothek von Java.
Wir verwenden die folgenden Schritte, um das JSON-Dokument zu validieren:
- Erstellen Sie ein neues Maven-Projekt.
- Fügen Sie die JSON-Schema-Validator-Abhängigkeit in unserer pom.xml-Datei hinzu.
- Lesen Sie die Daten und das Schema aus dem JSON-Dokument mit ObjectMapper.
- Verwenden Sie die Methode „validate()“ der JsonSchemaFactory, um das JSON-Dokument zu validieren.
- Speichern Sie das zurückgegebene Ergebnis im Validierungssatz und drucken Sie es auf dem Bildschirm aus.
Jetzt ist alles eingerichtet, sodass wir den eigentlichen Code zur Validierung des JSON-Dokuments implementieren können.
JsonValidatorExample.java
//import required classes and packages package javaTpoint.ObjectToJsonConversion; import java.io.InputStream; import java.util.Set; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; import com.networknt.schema.SpecVersion; import com.networknt.schema.ValidationMessage; // create class to validate JSON document public class JsonValidatorExample { // create inputStreamFromClasspath() method to load the JSON data from the class path private static InputStream inputStreamFromClasspath( String path ) { // returning stream return Thread.currentThread().getContextClassLoader().getResourceAsStream( path ); } // main() method start public static void main( String[] args ) throws Exception { // create instance of the ObjectMapper class ObjectMapper objectMapper = new ObjectMapper(); // create an instance of the JsonSchemaFactory using version flag JsonSchemaFactory schemaFactory = JsonSchemaFactory.getInstance( SpecVersion.VersionFlag.V201909 ); // store the JSON data in InputStream try( InputStream jsonStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\data.json' ); InputStream schemaStream = inputStreamFromClasspath( 'C:\Users\ajeet\eclipse-workspace\schema.json' ) ){ // read data from the stream and store it into JsonNode JsonNode json = objectMapper.readTree(jsonStream); // get schema from the schemaStream and store it into JsonSchema JsonSchema schema = schemaFactory.getSchema(schemaStream); // create set of validation message and store result in it Set validationResult = schema.validate( json ); // show the validation errors if (validationResult.isEmpty()) { // show custom message if there is no validation error System.out.println( 'There is no validation errors' ); } else { // show all the validation error validationResult.forEach(vm -> System.out.println(vm.getMessage())); } } } }
Beschreibung
Im obigen Code verwenden wir die VersionFlag . Um die zu erhalten JsonSchemaFactory , muss dieses Versionsflag im Konstruktor übergeben werden. In unserem Fall verwenden wir die 2019-09 Version des JSON-Schemas.
Wir verwenden auch eine benutzerdefinierte Hilfsmethode, d. h. inputStreamFromClasspath(), um beide Dateien aus dem Klassenpfad zu laden. Wir erstellen eine Instanz der Jackson ObjectMapper-Klasse, um die JSON-Daten aus dem InputStream zu lesen. Danach analysieren wir diese InputStream-Daten in ein JsonNode-Objekt. Mithilfe der Instanz der JsonSchemaFactory erhalten wir das JsonSchema-Objekt zur Validierung des JsonNode. Wir erstellen eine Reihe von Validierungsfehlern, die ein oder mehrere ValidationMessage-Objekte enthalten. Der Validierungssatz ist leer, wenn kein Validierungsfehler vorliegt.
Ausgabe